提问者:小点点

pip在哪里安装带有虚拟环境的软件包?


情景:我创建了一个虚拟环境,并使用显式路径运行pip(无需寻源activate)。它是在全局dist软件包中安装软件包还是在虚拟环境的站点软件包中安装软件包

详细信息:pip在哪里安装其软件包?说明,pip在

注意:我在Ubuntu 16.04上


共2个答案

匿名用户

这在很大程度上取决于脚本使用的pip版本(不是语义版本,而是在创建venv时安装了多个“版本”)及其配置(可能包括您的环境)。

假设您的脚本有一行

/some/path/to/pip install <some package>

假设pip已经安装了至少一个包,您可以使用

/some/path/to/pip show <that package>

它将为您提供如下输出:

$ pip show numpy
Name: numpy
Version: 1.14.5
Summary: NumPy: array processing for numbers, strings, records, and objects.
Home-page: http://www.numpy.org
Author: Travis E. Oliphant et al.
Author-email: None
License: BSD
Location: /usr/lib/python3/dist-packages
Requires:

倒数第二行应该有助于回答您的问题。

匿名用户

  1. 裸命令(如pip在文件系统上引用的可执行文件取决于$PATH。在哪个pip中查找正确的pip(键入pip,如果有人真的很邪恶,并为其制作了一个shell别名)。查看which-a pip,查看第一个pip可能正在跟踪的其他pip。请注意,有些shell缓存命令到文件的映射,有时会导致缓存失效(如果您看到奇怪的行为,并且认为您的shell缓存混乱,请尝试hash-r
  2. 一种命令,如/pip。venv/bin/pip将不会通过$PATH进行搜索。那是因为它有一条斜线
  3. 好的,您已经找到了文件pip,它是一个可执行脚本。该文件的第一行称为shebang,它告诉您哪个解释器与该pip脚本关联。查看head-1。venv/bin/pip。如果pip被安装到venv中,那么它将始终与venv的Python相匹配,假设您没有手动编辑它,因为安装程序本身编写了这个shebang(有趣的事实:即使您直接在源代码中添加了不同的代码,安装程序也会重写它!)
  4. pip install将把文件放在相关解释器的sysconfig显示的位置。第1点告诉您“pip”的确切含义,第2点告诉您“关联解释器”的确切含义。sysconfig位置取决于平台。通过运行path/to/python-msysconfig | grep“Paths:--10之后查找“purelib”路径,找出位置

“激活”一个venv并没有什么神奇之处,它只是设置了环境变量,比如$PATH。如果您了解1-3的工作原理,您就了解了激活venv的工作原理。

因此,现在您应该能够在不猜测的情况下推理答案:使用类似的路径。venv/bin/pip与激活venv(改变$PATH,改变pip的含义,导致相同的。venv/bin/pip)没有区别。

附录:为什么人们在安装pip时会遇到这么多麻烦?

糟糕的卫生。我认为他们搞砸了他们的系统,以某种方式扰乱了sys.path(在启动脚本中附加到它,用户站点,sitecustomize.py,在. bashrc中设置PYTHONPATHenv var,安装一些蹩脚的包,变异它,遵循一些蹩脚的指南,有一个sudo pip安装...

看看pip“脚本”,它只是一个由setuptools编写的控制台入口点。此脚本是在安装时从模板创建的。实际上,在pip的源代码中找不到这个文件,因为它不存在。

#!/path/to/.venv/bin/python3
# -*- coding: utf-8 -*-
import re
import sys

from pip._internal.main import main  # <--- look at this import statement! 

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    sys.exit(main())

可执行脚本做的第一件事是尝试从pip模块导入其私有API,从pip模块导入的在哪里得到解决取决于sys.path。第一场比赛获胜。当pip出现随机中断时,你应该总是问自己“这个导入语句是否仍然找到安装程序在创建脚本时编写的相同的pip/__init__. py文件?”

如果不是,或者shebang看起来不正确,只需删除它并重新安装pip。