情况:我已经创建了一个虚拟环境,并使用了明确的路径来运行pip
(无需采购activate
)。它是将软件包安装在全局dist-packages
中还是将它们安装在虚拟环境的site-packages
中。
详细信息:
如Where does pip install its packages?所述,与虚拟环境一起使用时,pip在<virtualenv_name>/lib/<python_ver>/site-packages
中安装软件包。根据我的经验,当我激活virtualenv时确实如此。我有一个现有的bash脚本,可直接激活到pip
可执行文件而无需激活virtualenv。这是否仍将软件包安装在virtualenv的站点软件包中?还是将它们安装在/local/lib/<python-version>/dist-packages
中?
注意:我正在使用Ubuntu 16.04
答案 0 :(得分:2)
这在很大程度上取决于脚本使用的pip的哪个版本(不是语义版本,而是在创建venv时安装的具有多个“版本”的pip)。 ,以及它的配置(可能包括您的环境)。
假设您的脚本中有一行
/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 :(得分:1)
pip
之类的裸命令在文件系统上引用的可执行文件取决于$ PATH。在which pip
中查找正确的名称(type pip
,如果某人确实是邪恶的,并为其命名为shell别名)。查看which -a pip
,看看还有哪些其他东西在徘徊,第一个可能是阴影。请注意,某些外壳会缓存命令到文件的映射,有时会搞糟它们的缓存失效(如果您看到奇怪的行为,并且认为您的外壳缓存混乱了,请尝试hash -r
。./pip
或.venv/bin/pip
之类的命令将不通过$ PATH搜索。那是因为它里面有一个斜线。pip
,它是一个可执行脚本。该文件的第一行称为 shebang ,它告诉您与该pip脚本关联的解释器。看head -1 .venv/bin/pip
。如果pip已安装到venv中,则假定您没有手动编辑它,它将始终与venv的Python匹配,因为安装程序本身会将其写出来(有趣的事实:即使您在源代码中直接放置了另一个,安装程序重写了它!)。pip install
将把文件放在相关解释器的sysconfig所指的位置。第一点指出了“点子”的确切含义,第二点指出了“相关解释器”的含义。 sysconfig位置取决于平台。通过运行path/to/python -m sysconfig | grep "Paths:" --after 10
找出位置,然后查找“ purelib”路径。“激活” venv并没有什么神奇之处,它只是设置envar vars,例如$ PATH。如果您了解1-3的工作原理,就会了解激活venv的工作原理。
因此,现在您应该能够推理出答案而无需猜测:使用类似.venv/bin/pip
的路径而不是激活venv(这将更改$ PATH,这将更改pip
的含义,从而导致相同的{ {1}}没什么区别。
附录: 为什么人们在安装pip时会遇到很多麻烦?
Bad hygiene.我认为他们通过以某种方式弄乱.venv/bin/pip
(在启动脚本,用户站点,sitecustomize.py,设置sys.path
env中附加)来弄乱系统var在.bashrc中,安装了一些使它突变的糟糕的程序包,遵循一些PYTHONPATH
糟糕的指南...可能性无限!)
看看sudo pip install
“脚本”,它只是setuptools写出的控制台入口点。该脚本是在安装时从模板创建的。实际上,您不会在pip的源代码中的任何地方找到此文件,因为该文件在那里不存在。
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())
模块导入其私有API,而pip
模块导入的解析位置取决于{{1 }}。首场比赛获胜。当pip随机中断时,您应该总是问自己“此导入语句是否仍找到安装程序在创建脚本时写出的相同from pip
文件?”
如果不是,或者shebang看起来不对,只需将其删除并重新安装pip。