在全局站点包中安装pip而不是虚拟环境

148
使用pip3virtualenv中安装包会导致该包被安装在全局的site-packages文件夹里,而不是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 testpy3 -p python3
cd testpy3
source bin/activate

注意:如果我未指定 -p python3,那么虚拟环境的 bin 文件夹中将缺少 pip。

运行 which pipwhich pip3 命令,都会返回虚拟环境文件夹:

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

现在,当我尝试在激活的虚拟环境中使用pip安装Markdown时,pip会将其安装在全局的site-packages文件夹中,而不是虚拟环境的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,而虚拟环境文件夹则不包含。

注意:在另一个虚拟机上,我之前已安装了 Python2 和 Python3(按照这些说明进行操作),并且在使用 Python3 时遇到了同样的问题;但在基于 Python2 的虚拟环境中安装包却非常顺利。

非常感谢任何技巧、提示等。


如果已经安装了某个软件包,pip 将不会再次安装它。在输出中,你应该看到“Requirement already satisfied”(要求已满足)。尝试安装一个你还没有的软件包。顺便说一下,pip3 可能使用非 Homebrew 的 Python3(你如何安装 pip3?)。这本身可能并不是坏事,但你应该意识到这一点。 - jfs
1
我以前没有安装Markdown。全局包列表为空。无论我尝试什么包,每次都可以重现这种行为。 - DocZerø
关于pip3:它是与Python3一起由homebrew安装的。 - DocZerø
对我来说,这也很有帮助:https://dev59.com/n2Uq5IYBdhLWcg3wNtuB 只是为了让其他人知道。 - Nagaraj Tantri
38个回答

133

很有趣,你提到了这个问题,我也遇到了完全相同的问题。我最终解决了它,但仍不确定是什么原因导致的。

尝试检查你的bin/pipbin/activate脚本。在bin/pip中,查看shebang。它是否正确?如果不正确,请更正。然后在你的bin/activate中的第~42行,检查你的虚拟环境路径是否正确。它会像这样:

VIRTUAL_ENV="/Users/me/path/to/virtual/environment"
如果有误,进行更正,deactivate,然后.bin/activate,如果我们共同的问题具有相同的原因,它应该能够解决。如果仍然不行,你仍在正确的轨道上。我曾经像你一样通过反复使用which pip,跟踪堆栈等方式来解决相同的问题。
请务必要确保:
/Users/kristof/VirtualEnvs/testpy3/bin/pip3

这就是你想要的,而不是指另一个同名测试项目(我曾遇到过这个问题,也不知道它是如何开始的。我怀疑是同时运行多个虚拟环境所致)。

如果这些方法都不管用,一个临时解决办法是像Joe Holloway所说的那样:

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

也许不是理想的解决方法,但应该能解决眼下的问题。

链接到我的原始问题:

VirtualEnv/Pip trying to install packages globally


1
谢谢Chase。在发布我的问题之前,我看到了你的问题,但似乎我跳过了最后一行提到的shebang。实际上,它被设置为#!/usr/local/bin/python3.3而不是#!/Users/kristof/VirtualEnvs/testpy3/bin/python3.3。我进行了更改,激活了虚拟环境并安装了Markdown包。现在,Pip会安装在虚拟环境site-packages文件夹中,而不是全局文件夹中。 - DocZerø
我也遇到了这个问题,非常感谢您的答案。我注意到了shebangs,然后立即找到了这个问题,证实了我的猜测。有人知道为什么shebang是错误的吗?如果我们不得不每次创建新的虚拟环境时都要检查它,那么找到一个永久性的解决方案会很好。 - Will
2
我也遇到了同样的问题。我的 activate 脚本没问题,但是要注意,所有的 pip* 脚本和 easy_install* 脚本都有错误的 shebang。它们都需要手动修复。我无法通过重新安装 pip 或其他方式来解决它们。此外,对于 Joe Holloway 的解决方法需要澄清一下:问题不在于 shell 搜索 pip,而在于 pip 明确指定了错误的 python。因此,您需要自己指定 python,像这样:$ ~/.virtualenvs/venv/bin/python ~/.virtualenvs/venv/bin/pip --version - Neil Traft
6
当我重命名一个中间目录时,这件事情就发生在我身上了,因此我不得不编辑 '/bin' 目录下的 activate 和 pip 脚本。 - joarleymoraes
1
这个对我有用。我的问题是我改了文件夹名称,所以activate里的路径不再正确。谢谢! - Reboot_87
显示剩余3条评论

22

我曾遇到同样的问题,我通过删除 venv 文件夹并重新创建来解决它!

deactivate (if venv is activated first deactivate it)
rm -rf venv
virtualenv -p python3 venv
. ENV/bin/activate
pip3 install -r requirements.txt

现在一切都像魔法般地运作。

编辑:这是针对Python3的虚拟环境修改过的代码:

deactivate # (if venv is activated first deactivate it)
rm -rf venv # Delete the old venv directory
python3 -m venv venv # Recreate a new, empty venv
. venv/bin/activate # Activate it
pip3 install -r requirements.txt # Install the dependencies

1
我在使用虚拟环境时使用了 pip3,但默认情况下,virtualenv 使用 python2,因此使用 pip 而不是 pip3。我检查了 bin 目录,发现没有 pip3。使用 virtualenv -p python3 venv 解决了这个问题。 - subtleseeker
这解决了我的问题。Pycharm的自动虚拟环境创建功能出了点问题,手动安装解决了。谢谢。 - Alvaro Rodriguez Scelza
对我来说,重新删除venv并重新安装它很有帮助。virtualenv从python3.6开始已经被弃用,可以使用'python3.6 -m venv'代替。 - questionto42
我使用的是Windows系统,之前看其他答案时遇到了一些问题。非常感谢您提供的帮助。 - Jobo Fernandez
在我看来,关键是在调用pip install之前激活虚拟环境。对我来说,激活步骤被省略了。 - C.J.

22

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

此外,由于某些原因, add2virtualenv 没有将我的项目路径添加到virtualenv中的$PYTHONPATH。

这里提供一些解决方法,希望有所帮助!干杯!


谢谢!对我来说,这是由于ROS设置脚本引起的:source /opt/ros/melodic/setup.bash - Lincoln
谢谢这个主意!出于某种我无法记起的原因,我曾经在之前的笔记本电脑上编辑过我的.bashrc文件。当我迁移到新的电脑时,旧的.bashrc文件搞乱了我的新设置。给我带来困扰的那一行是alias pip='/usr/bin/pip' - dsesto

10

首先要检查的是pip解析到哪个位置:

which pip

如果您处于虚拟环境中,您希望得到如下输出:

/path/to/virtualenv/.name_of_virtualenv/bin/pip

然而,由于某些原因,它可能会解析为系统pip。例如,您可能会在虚拟环境中看到以下内容(这是不好的):

/usr/local/bin/pip (或任何不在您的虚拟环境路径中的内容)。

要解决此问题,请检查pipconfig文件:

~/.pipconf
~/.conf/pip
/etc/pip.conf

确保没有任何东西强制你的Python路径或pip路径(这对我有用)。

然后尝试启动一个新的终端并重新构建你的虚拟环境(删除然后再创建一次)。


2
还要检查/etc/pip.conf!我曾经遇到过类似的问题,经过大量调试后发现有人通过操纵这个文件来错误地配置了我正在使用的系统。 - t.animal
我正在使用Arch Linux。我认为/etc/pip.conf是由操作系统设置的。 - Q. Qiao
2
我定义了一个终端会话别名,覆盖了pip,但由于某些原因,“which pip”仍然给出了正确的路径! - Matteo
如何在Windows中解决这个问题? 我在虚拟环境和全局环境中得到了相同的路径: /c/Users/UserName/AppData/Local/Programs/Python/Python39/Scripts/pip - Aakash Solanki
@AakashSolanki 只需删除 venv 文件夹并重新创建它。然后在新的 venv 中重新安装软件包。 - Matin Sasan

8

我在macOS上安装了Python 2和3,遇到了相同的问题。

此外,我在我的.bash_profile中添加了别名来指向Python3和pip3。

alias python=/usr/local/bin/python3
alias pip=/usr/local/bin/pip3

通过使用 python3 -m venv venv 命令来移除别名并重新创建虚拟环境,可以解决该问题。


在我看来,macOS 上的 Python 安装是毫无必要的痛苦。 - iomv
我非常苦恼,但最后找到了解决方法:"which pip" 找出了问题所在,"unalias pip" 则解决了问题。 - Colin

8

进入您的虚拟环境中的bin目录,然后编写以下代码:

./pip3 install <package-name>

5
我也遇到了这个问题。在我的Mavericks Mac上,在Python 3.3虚拟环境中的/bin目录中调用pip install <package_name>导致Python包被安装在Python 2.7全局site-packages目录中,尽管我的$PATH以包含pip的目录开头。很奇怪,在CentOS上不会发生这种情况。对我来说,解决方案是使用pip3而不是pip。当我通过ez_setup在虚拟环境中安装pip时,在/bin目录中安装了三个"pip"可执行文件- pippip3pip3.3。奇怪的是,这三个文件完全相同。调用pip3 install <package_name>会将Python包正确地安装到本地site-packages目录中。使用虚拟环境的完整路径名调用pip也可以正常工作。我很想知道为什么我的Mac没有按照我预期的那样使用$PATH。

5

我在虚拟环境中安装Python包时遇到了同样的问题。但是,我的根本原因不同。在虚拟环境中,我(出于习惯,在Ubuntu上)执行了以下操作:

sudo easy_install -Z <package>

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


4
我在运行Manjaro时遇到了同样的问题。 我使用python3 -m ven venv创建了虚拟环境,然后使用source venv/bin/actiave激活。 无论是which python还是which pip都指向了虚拟环境中的正确二进制文件,但即使使用二进制文件的完整路径,我也无法安装到虚拟环境中。事实证明,当我使用sudo pacman -R python-pip python-reportlab(必须包括reportlab以满足依赖项)卸载了python-pip软件包之后,一切都按预期工作。不确定为什么,但这可能是由于系统软件包重复安装导致的。

我在Manjaro上也遇到了这个问题,并且用同样的方法解决了它。解决后,我通过pamac重新安装了python-pip,虚拟环境中的pip继续正常工作。不确定具体发生了什么,但我同意您对双重安装问题的评估。 - sid

3
我在更新pip到8.0.0版本后也遇到了类似的问题。为了解决它,我需要通过调试pip来查找错误路径。
结果发现,我的配置文件夹中有一个distutils配置文件,其中存在一些空路径值。这导致所有的软件包都被安装到同一个根目录下,而不是适当的虚拟环境(在我这里是/lib/site-packages)。
我不确定如何生成该配置文件或为什么它存在空值,但是它是在更新pip之后开始的。
如果其他人也遇到了相同的问题,只需删除文件~/.pydistutils.cfg(或删除空配置路径),因为pip将返回默认分布式配置,这样就可以解决该问题。

1
这也是我的问题。我的文件看起来像这样,不知道它是怎么出现的: [install]\nprefix= - foslock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接