使用pip在虚拟环境中安装Python包失败

38

我安装twisted时遇到了问题

pip --version

来自/home/chris/GL/GLBackend/glenv/lib/python2.7/site-packages/pip-1.1-py2.7.egg的pip 1.1 (Python 2.7)

创建虚拟环境

chris@chris-mint ~/GL/GLBackend $ sudo virtualenv -p python2.7 glenv

使用解释器 /usr/bin/python2.7 运行 virtualenv。在 glenv/bin/python2.7 中有一个新的 python 可执行文件,同时在 glenv/bin/python 中创建了一个可执行文件。正在安装 distribute.............................................................................................................................................................................................完成。安装 pip...............完成。

以防万一,我会启用所有权限。

chris@chris-mint ~/GL/GLBackend $ sudo chmod -R 777 glenv

chris@chris-mint ~/GL/GLBackend $ source glenv/bin/activate


(glenv)chris@chris-mint ~/GL/GLBackend $ pip freeze

argparse==1.2.1 distribute==0.6.24 wsgiref==0.1.2

这里未列出已安装的twisted模块。

(glenv)chris@chris-mint ~/GL/GLBackend $ sudo pip install twisted
已满足要求(使用--upgrade进行升级):twisted在/usr/local/lib/python2.7/dist-packages中 要求已经满足(使用--upgrade进行升级):zope.interface>=3.6.0在/usr/local/lib/python2.7/dist-packages中(来自twisted) 要求已经满足(使用--upgrade进行升级):distribute在/usr/local/lib/python2.7/dist-packages中(来自zope.interface>=3.6.0->twisted) 清理... (glenv)chris@chris-mint ~/GL/GLBackend $ pip uninstall twisted 无法卸载要求的twisted,因为它未安装 完整日志存储在/home/chris/.pip/pip.log中。
但当我安装它时,它说已经安装了。强制安装:
sudo pip install -I twisted

下载/解压twisted,下载Twisted-12.3.0.tar.bz2 (2.6Mb):已下载2.6Mb 运行setup.py egg_info安装twisted...

成功安装twisted zope.interface distribute 清理中...

但它仍未安装

(glenv)chris@chris-mint ~/GL/GLBackend $ pip freeze

argparse==1.2.1 distribute==0.6.24 wsgiref==0.1.2

当我尝试运行使用twisted的Python脚本时,出现了一个错误,提示twisted没有安装:

ImportError: No module named twisted.python


为什么在virtualenv下使用pip install时要加上sudo?我不确定pip是否尝试安装到系统中(也就是像你看到的那样仍然放在/usr/local/lib/python2.7中,而不是像你想要的那样放在~/glenv中),但这至少是有道理的。(你也不应该在创建venv时首先使用sudo。) - abarnert
@abarnert已经回答了你,而且你似乎正在经历与https://dev59.com/zWUq5IYBdhLWcg3wPuBQ相同的问题。 - Hugo Lopes Tavares
2个回答

60
问题在于您在不应该使用sudo的情况下使用了它,这导致pip试图安装到/usr/local/lib而不是~/glenv/lib。(而且,由于您使用了sudo,它已经成功地这样做了,但这并没有帮助您,因为您不允许系统 site-packages 在您的 venv 中。) sudo pip导致此行为的原因有多种,但最可能的原因是:在大多数系统上(包括我立即可以访问的各种 Mac 和 RHEL/CentOS 系统),sudoers 文件将重置您的环境,然后再添加回一些白名单环境变量。这意味着当您执行sudo pip时,它将无法看到virtualenv设置的环境变量,因此它将退回到执行默认操作并安装到系统 Python 中,而不是您的 venv。
但实际上,这不重要,为什么会发生这种情况。答案是一样的:只需要使用pip install而不是sudo pip install
注意,您还需要在virtualenv调用上删除sudo,因为这可能会导致 venv 设置不正确(这就是为什么您需要sudo chmod,否则不需要它的原因)。在用户主目录下安装东西的整个重点在于您可以使用普通用户权限进行操作。
作为一个附注,您也可能想升级到更新的virtualenv/pip,因为1.8和1.2有一些 bug 修复和改进。但我已经验证即使在最新版本(1.8.4 和 1.2.1)中,我也会遇到与您完全相同的问题,因此我认为这在这里并不相关。

3
如果我想将virtualenv安装在/opt文件夹中,该怎么办?我收到了“权限被拒绝”的错误提示。 - user2268507
@Giri:你可以使用sudo创建一个子目录,给你的用户或组权限,然后在那里做所有的virtualenv操作而不需要sudo。如果是普通用户,你可能更喜欢使用他们的主目录。 - Mark

0

sudo pip 在这里引起了问题。它会将软件包安装在您的系统中,而不是您创建的虚拟环境中。因此,当它说要求已经满足时,请尝试查看它所指向的目录。在您的情况下,当您尝试安装时,它指向的是 /usr/local/lib/python2.7/dist-packages

如果它在类似于 /usr/local/lib/... 的东西中,它并没有指向您的虚拟环境文件夹,那么它就被安装在了您的系统中。否则,在正确的情况下,它应该看起来像这样 /usr/local/lib/..../<name of your virtualenv>/lib

您可以随时使用命令 which pythonwhich pip 来查看它们是否都在使用我们的虚拟环境的占位符。


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