未使用 pip 在 virtualenv 中安装 Python 包
Posted
技术标签:
【中文标题】未使用 pip 在 virtualenv 中安装 Python 包【英文标题】:Python packages not installing in virtualenv using pip 【发布时间】:2013-01-19 15:45:26 【问题描述】:我在安装 twisted 时遇到问题
pip --version
pip 1.1 从 /home/chris/GL/GLBackend/gleenv/lib/python2.7/site-packages/pip-1.1-py2.7.egg (python 2.7)
创建虚拟环境
chris@chris-mint ~/GL/GLBackend $ sudo virtualenv -p python2.7 glenv
使用解释器运行 virtualenv /usr/bin/python2.7 新 python glenv/bin/python2.7 中的可执行文件也在其中创建可执行文件 glenv/bin/python 安装 分发................................................. ..................................................... ..................................................... ........................................完毕。 安装 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 分发==0.6.24 wsgiref==0.1.2
twisted 未在此处列出为已安装
(glenv)chris@chris-mint ~/GL/GLBackend $ sudo pip install twisted
要求已经满足(使用 --upgrade 升级):扭曲 /usr/local/lib/python2.7/dist-packages 要求已经满足 (使用 --upgrade 升级): zope.interface>=3.6.0 in /usr/local/lib/python2.7/dist-packages(来自twisted)要求 已经满足(使用 --upgrade 升级):分发 /usr/local/lib/python2.7/dist-packages(来自 zope.interface>=3.6.0->twisted) 清理... (glenv)chris@chris-mint ~/GL/GLBackend $ pip uninstall 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 for package 扭曲的 . . .
成功安装twisted zope.interface 分发清理 起来……
但它仍然没有安装
(glenv)chris@chris-mint ~/GL/GLBackend $ pip freeze
argparse==1.2.1 分发==0.6.24 wsgiref==0.1.2
**当我尝试运行使用 twisted 的 Python 脚本时,我收到一条错误消息,指出未安装 twisted。那就是:
ImportError: No module named twisted.python**
【问题讨论】:
为什么在virtualenv
下使用sudo
和pip install
?当您使用@987654334 时,我不确定pip
是否会尝试安装到系统中(也就是说,如您所见,仍然放入/usr/local/lib/python2.7
,而不是~/glenv
) @,但这至少是合理的。 (你也不应该首先使用sudo
来创建你的venv。)
@abarnert 已经回答了你,你似乎遇到了和***.com/q/14665330/565999一样的问题
【参考方案1】:
这里的问题是你不应该使用sudo
。这导致pip
尝试安装到/usr/local/lib
而不是~/glenv/lib
。 (而且,因为您使用了sudo
,所以它成功地这样做了,但这对您没有帮助,因为您不允许在您的 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 有一些错误修复和改进。但我证实,即使使用最新(1.8.4 和 1.2.1)版本,我也会遇到与您完全相同的问题,所以我认为这与这里无关。
【讨论】:
如果我想在/opt
文件夹中安装我的virtualenv
怎么办?我收到Permission Denied
错误。
@Giri:您可以使用 sudo 创建一个子目录,授予您的用户或组权限,然后在没有 sudo 的情况下执行所有 virtualenv 内容。如果是普通用户,你可能更喜欢使用他们的 homedir。【参考方案2】:
sudo pip
导致了这里的问题。它会将软件包安装在您的系统中,而不是您创建的虚拟环境中。因此,当它说要求已经满足时。尝试添加它指向的目录。在您尝试安装时,您的情况是/usr/local/lib/python2.7/dist-packages
如果它位于 /usr/local/lib/...
之类的东西中,它不指向您的 virtualenv 文件夹,那么它就会安装在您的系统中。否则,在正确的情况下,它看起来像这样/usr/local/lib/..../<name of your virtualenv>/lib
。
您始终可以使用which python
和which pip
之类的命令来查看它们是否都在使用我们虚拟环境的占位符。
【讨论】:
以上是关于未使用 pip 在 virtualenv 中安装 Python 包的主要内容,如果未能解决你的问题,请参考以下文章
pip install mod_wsgi 在 virtualenv 中失败
从 crontab 在 virtualenv 中运行 python 方法