情景:我创建了一个虚拟环境,并使用显式路径运行pip
(无需寻源activate
)。它是在全局dist软件包中安装软件包
还是在虚拟环境的站点软件包中安装软件包
。
详细信息:pip在哪里安装其软件包?说明,pip在
注意:我在Ubuntu 16.04上
这在很大程度上取决于脚本使用的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:
倒数第二行应该有助于回答您的问题。
pip
在文件系统上引用的可执行文件取决于$PATH。在哪个pip
中查找正确的pip(键入pip
,如果有人真的很邪恶,并为其制作了一个shell别名)。查看which-a pip
,查看第一个pip可能正在跟踪的其他pip。请注意,有些shell缓存命令到文件的映射,有时会导致缓存失效(如果您看到奇怪的行为,并且认为您的shell缓存混乱,请尝试hash-r
)李> /pip
或。venv/bin/pip
将不会通过$PATH进行搜索。那是因为它有一条斜线李> pip
,它是一个可执行脚本。该文件的第一行称为shebang,它告诉您哪个解释器与该pip脚本关联。查看head-1。venv/bin/pip
。如果pip被安装到venv中,那么它将始终与venv的Python相匹配,假设您没有手动编辑它,因为安装程序本身编写了这个shebang(有趣的事实:即使您直接在源代码中添加了不同的代码,安装程序也会重写它!)李> 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中设置PYTHONPATH
env 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。