pip 安装在全局站点包而不是 virtualenv

Posted

技术标签:

【中文标题】pip 安装在全局站点包而不是 virtualenv【英文标题】:pip installing in global site-packages instead of virtualenv 【发布时间】:2014-01-24 00:34:33 【问题描述】:

使用pip3virtualenv 中安装包会导致该包安装在全局站点包文件夹中,而不是安装在virtualenv 文件夹中。以下是我在 OS X Mavericks (10.9.1) 上设置 Python3 和 virtualenv 的方法:

我使用 Homebrew 安装了 Python3:

ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
brew install python3 --with-brewed-openssl

更改了.bash_profile 中的$PATH 变量;添加以下行:

export PATH=/usr/local/bin:$PATH

运行which python3 返回/usr/local/bin/python3(在重新启动shell 之后)。

注意:which python3 仍然返回 /usr/bin/python

使用pip3安装virtualenv

pip3 install virtualenv

接下来,创建一个新的virtualenv 并激活它:

virtualenv testpy3 -p python3
cd testpy3
source bin/activate

注意:如果我不指定 -p python3,则 virtualenv 中的 bin 文件夹中将缺少 pip。

运行 which pipwhich pip3 都返回 virtualenv 文件夹:

/Users/kristof/VirtualEnvs/testpy3/bin/pip3

现在,当我尝试安装时,例如在激活的 virtualenv 中使用 pip 进行 Markdown,pip 将安装在全局 site-packages 文件夹中,而不是 virtualenv 的 site-packages 文件夹中。

pip install markdown

运行pip list 返回:

Markdown (2.3.1)
pip (1.4.1)
setuptools (2.0.1)
virtualenv (1.11)

/Users/kristof/VirtualEnvs/testpy3/lib/python3.3/site-packages的内容:

__pycache__/
_markerlib/
easy_install.py
pip/
pip-1.5.dist-info/
pkg_resources.py
setuptools/
setuptools-2.0.2.dist-info/

/usr/local/lib/python3.3/site-packages的内容:

Markdown-2.3.1-py3.3.egg-info/
__pycache__/
easy-install.pth
markdown/
pip-1.4.1-py3.3.egg/
setuptools-2.0.1-py3.3.egg
setuptools.pth
virtualenv-1.11-py3.3.egg-info/
virtualenv.py
virtualenv_support/

如您所见,global site-packages 文件夹包含 Markdown,而 virtualenv 文件夹不包含。

注意:我之前在不同的 VM 上安装了 Python2 和 Python3(遵循these 指令)并且在 Python3 上遇到了同样的问题;不过,在基于 Python2 的 virtualenv 中安装包可以完美运行。

任何提示、提示……将不胜感激。

【问题讨论】:

pip 不会安装已经可用的包。您应该在其输出中看到“要求已经满足”。尝试安装您还没有的软件包。顺便说一句,pip3 可能使用非 brew python3(你如何安装pip3?)。它本身可能并不坏,但如果是的话,你应该知道。 我之前没有安装 Markdown。全局包列表为空。不管我尝试什么包,我每次都可以重现这种行为。 关于 pip3:这是由自制软件和 Python3 一起安装的。 对我来说这也有帮助:***.com/questions/14695278/… 仅供参考 【参考方案1】:

我也有这个问题。调用sudo pip install 导致Python 包安装在全局站点包目录中,调用pip install 工作正常。 所以在 virtualenv 中不要使用 sudo

【讨论】:

或者如果你使用sudo,你也必须激活虚拟环境。 sudo su 后跟 <venv>/bin/activate 后跟 pip install【参考方案2】:

我在从 virtualenv 中安装 python 包时遇到了同样的问题。 我的根本原因是不同的。 在 virtualenv 中,我(在 Ubuntu 上不习惯)正在做:

sudo easy_install -Z <package>

这导致 bin/pip shebang 被忽略,它使用 root 的非 virtualenv python 将其安装在全局站点包中。 由于我们有一个虚拟环境,我们应该安装没有“sudo”的包

【讨论】:

【参考方案3】:

对我来说,这不是 pip 或 virtualenv 问题。这是一个python问题。在在线学习了一些教程之后,我在 ~/.bash_profile(或 ~/.bashrc)中手动设置了我的 $PYTHONPATH。这个手动设置的 $PYTHONPATH 在 vi​​rtualenv 中是可用的,因为它可能应该被允许。

另外,add2virtualenv 没有在 virtualenv 中将我的项目路径添加到我的 $PYTHONPATH 中。

只是为那些可能仍被卡住的人提供了一些分岔路!干杯!

【讨论】:

谢谢!对我来说,这是由 ros 设置脚本引起的:source /opt/ros/melodic/setup.bash【参考方案4】:

我也有这个问题。在我的 Mavericks Mac 上的 Python 3.3 虚拟环境中从 /bin 目录调用 pip install &lt;package_name&gt; 会导致 Python 包安装在 Python 2.7 全局站点包目录中。尽管我的 $PATH 是从包含pip 的目录开始的。诡异的。这不会发生在 CentOS 上。对我来说,解决方案是调用pip3 而不是pip。当我通过 ez_setup 在虚拟环境中安装 pip 时,三个“pip”可执行文件已安装在 /bin 目录中 - pippip3pip3.3。奇怪的是,这三个文件完全一样。调用 pip3 install &lt;package_name&gt; 会导致 Python 包正确安装到本地站点包目录中。在虚拟环境中使用完整路径名调用pip 也可以正常工作。我很想知道为什么我的 Mac 没有像我期望的那样使用 $PATH。

【讨论】:

【参考方案5】:

有趣的是,您提出了这个问题,我也遇到了完全相同的问题。我最终解决了它,但我仍然不确定是什么原因造成的。

尝试检查您的 bin/pipbin/activate 脚本。在bin/pip,看看shebang。这是正确的吗?如果不是,请纠正它。然后在bin/activate 中的~42 线上,检查你的virtualenv 路径是否正确。它看起来像这样

VIRTUAL_ENV="/Users/me/path/to/virtual/environment"

如果有问题,请更正,deactivate,然后是. bin/activate,如果我们共同的问题有相同的原因,它应该可以工作。如果它仍然没有,无论如何,你在正确的轨道上。我经历了和你一样的问题解决程序,一遍又一遍地which piping,跟踪堆栈跟踪等等。

绝对确定

/Users/kristof/VirtualEnvs/testpy3/bin/pip3

是你想要的,而不是指另一个同名的测试项目(我遇到了这个问题,不知道它是如何开始的。我怀疑是同时运行多个 virtualenvs)。

如果这些都不起作用,那么临时解决方案可能是,正如乔·霍洛威所说,

只需使用完整路径运行 virtualenv 的 pip(即不要依赖搜索可执行路径),您甚至不需要激活环境。它会做正确的事。

也许不理想,但它应该在紧要关头工作。

链接到我原来的问题:

VirtualEnv/Pip trying to install packages globally

【讨论】:

谢谢蔡斯。在发布我的问题之前,我遇到了你的问题,但似乎我跳过了提到 shebang 的最后一行。事实上,它被设置为#!/usr/local/bin/python3.3 而不是#!/Users/kristof/VirtualEnvs/testpy3/bin/python3.3。我更改了它,激活了 virtualenv 并安装了 Markdown 包。 Pip 现在安装在 virtualenv 站点包文件夹而不是全局文件夹中。 我也遇到了这个问题,非常感谢您的回答。我注意到了shebangs,然后立即发现了这个问题,证实了我的怀疑。有谁知道为什么shebang错了?最好能找到一个永久修复,这样我们就不必在每次创建新的虚拟环境时都检查它。 我遇到了同样的问题。我的activate 脚本很好,但是当心所有pip* 脚本和easy_install* 脚本有错误的shebang。它们都必须手动修复。我无法通过重新安装 pip 或类似的东西来修复它们。此外,对 Joe Holloway 的解决方法进行了澄清:问题不在于 shell 搜索 pip,而是 pip 明确指定了 wrong python。因此,您需要自己指定 python,如下所示:$ ~/.virtualenvs/venv/bin/python ~/.virtualenvs/venv/bin/pip --version 我在 --relocatable 我的 env 之后遇到了这个问题,第 42 行是错误的,看起来 --relocatable 做得不对。 这发生在我重命名中间目录时,所以我不得不在 '/bin' 中编辑激活和 pip 脚本

以上是关于pip 安装在全局站点包而不是 virtualenv的主要内容,如果未能解决你的问题,请参考以下文章

关于 python 中 虚拟环 virtualen境的操作

在 virtualenv 中控制 pip 版本

virtualenv 不包括 pip

在使用 github 操作进行构建期间执行诗歌安装时,使用预编译的 numpy 包而不是构建它

当安装包而不是单个学说依赖项时,如何更新 orm-pack 的单个包?

让 virtualenv 从你的全局站点包中继承特定的包