pip在哪里将虚拟环境安装软件包?

时间:2019-11-01 17:20:54

标签: python pip virtualenv

情况:我已经创建了一个虚拟环境,并使用了明确的路径来运行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

2 个答案:

答案 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)

  1. 诸如pip之类的裸命令在文件系统上引用的可执行文件取决于$ PATH。在which pip中查找正确的名称(type pip,如果某人确实是邪恶的,并为其命名为shell别名)。查看which -a pip,看看还有哪些其他东西在徘徊,第一个可能是阴影。请注意,某些外壳会缓存命令到文件的映射,有时会搞糟它们的缓存失效(如果您看到奇怪的行为,并且认为您的外壳缓存混乱了,请尝试hash -r
  2. 诸如./pip.venv/bin/pip之类的命令将通过$ PATH搜索。那是因为它里面有一个斜线。
  3. 好的,所以您找到了文件 pip,它是一个可执行脚本。该文件的第一行称为 shebang ,它告诉您与该pip脚本关联的解释器。看head -1 .venv/bin/pip。如果pip已安装到venv中,则假定您没有手动编辑它,它将始终与venv的Python匹配,因为安装程序本身会将其写出来(有趣的事实:即使您在源代码中直接放置了另一个,安装程序重写了它!)。
  4. 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。