繁体   English   中英

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

[英]Where does pip install packages with a virtual environment?

情况:我创建了一个虚拟环境并使用显式路径来运行pip (没有采购activate )。 它是在全局dist-packages中安装软件包还是将它们安装在虚拟环境的site-packages中。

详细信息: pip 在哪里安装它的包? 解释说,pip 在与虚拟环境一起使用时会在<virtualenv_name>/lib/<python_ver>/site-packages中安装软件包。 根据我的经验,当我激活 virtualenv 时这是真的。 我有一个现有的 bash 脚本,该脚本直接指向pip可执行文件,而无需激活 virtualenv。 这是否仍然在 virtualenv 的站点包中安装包? 还是将它们安装在/local/lib/<python-version>/dist-packages

注意:我在 Ubuntu 16.04

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

假设您的脚本有一行

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

并假设 pip 至少安装了一个 package,您可以使用

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

它会给你 output 看起来像:

$ 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。 看看which pip是正确的( type pip如果有人真的很邪恶并为它做了一个 shell 别名)。 查看which -a pip以查看第一个可能正在遮蔽的其他人。 请注意,某些 shell 缓存命令到文件的映射,有时会破坏它们的缓存失效(尝试hash -r如果您看到奇怪的行为并且您认为您的 shell 有一个混乱的缓存)。
  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 -m sysconfig | grep "Paths:" --after 10找出位置 path/to/python -m sysconfig | grep "Paths:" --after 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,安装一些使其突变的蹩脚的 package,以下一些sudo pip install的蹩脚指南......可能性无穷无尽!)

查看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,而from pip模块导入得到解决的地方取决于sys.path 第一场比赛获胜。 当 pip 出现随机损坏时,您应该始终问自己“此导入语句是否仍然找到安装程序在创建脚本时写出的相同pip/__init__.py文件?”

如果不是,或者shebang看起来不对,只需将其删除并重新安装pip。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM