【问题标题】:Python3 pip installing globally when in a virtualenv在 virtualenv 中全局安装 Python3 pip
【发布时间】:2014-01-23 12:44:37
【问题描述】:

尝试最终跳转到 Python 3,但在使用 virtualenvwrapper 时遇到了一些问题。我首先像这样创建虚拟环境:

mkvirtualenv -p /usr/local/bin/python3 projectname

产生:

Running virtualenv with interpreter /usr/local/bin/python3
Using base prefix '/usr/local/Cellar/python3/3.3.3/Frameworks/Python.framework/Versions/3.3'
New python executable in projectname/bin/python3.3
Also creating executable in projectname/bin/python
Installing setuptools, pip...done.

到目前为止,一切都很好。我检查 python 控制台以确保环境正在查看正确的解释器以及所有这些。这是悲伤发生的地方(当 virtualenv 处于活动状态时):

pip install flask自称成功,可惜:

Python 3.3.3 (default, Jan  2 2014, 13:26:32) 
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.2.79)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import flask
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'flask'

问题来了:

$ pip show flask
---
Name: Flask
Version: 0.10.1
Location: /usr/local/lib/python3.3/site-packages
Requires: Werkzeug, Jinja2, itsdangerous

除非我完全误解了 virtualenv/wrapper 及其各自的魔法(我很可能是),否则 pip install 似乎是全局安装 Flask 而不是我的 virtualenv 中的站点包,因此 virtualenv 是忽略它。

任何线索这里发生了什么/如何解决?假设 virtualenvwrapper 已准备好使用 python3 的黄金时段,我错了吗?我不必破坏我的 .bashrc 或手动设置环境变量的漂亮解决方案是可取的。我希望有一种方法可以通过 virtualenv 和 virtualenvwrapper 提供的 api 来做到这一点。

谢谢!

【问题讨论】:

  • pipvirtualenv 的版本是什么? (或者你使用venv而不是virtualenv?)我记得pip 1.4和最近的virtualenv版本(即使这些版本带有1.4)通过升级到pip 1.5解决了一些问题,但我不记得了如果这是问题所在……
  • 激活 virtualenv 后使用的 pip 是:来自 /usr/local/lib/python3.3/site-packages (python 3.3) 的 pip 1.5。我使用 virtualenvwrapper 来抽象掉 virtualenv 的东西,但是当我输入 virtualenv --version 我得到 1.11
  • 好的,所以它使用的是您的系统pip,而不是您的virtualenv 的pip,我预计会导致这个问题。 which pip 是否显示 /usr/local/bin/pip,或者它是正确的路径(你的环境中的那个)?
  • 或者,您也可以使用您的系统pip,只要您通过-E 或export PIP_RESPECT_VIRTUALENV=true。您可能还需要export PIP_VIRTUALENV_BASE=$WORKON_HOME
  • 如果您查看 pip 程序 (cat $(which pip)),您会发现 (a) 它是一个 Python 脚本,所以如果 #!行是错误的,您将运行错误的解释器,并且 (b) 这是一个简单的脚本,它只是从已安装的模块中导入和运行一些代码,所以如果它从错误的 sys.path 导入,您将得到错误的 pip 代码.我不知道这两个中的哪一个对你来说出了问题,或者为什么,或者如何解决它,但这可能会帮助你找出下一步该在哪里挖掘。

标签: python python-3.x virtualenv python-3.3 virtualenvwrapper


【解决方案1】:

我在全局安装包而不是在激活的 virtualenv 中安装包时遇到问题。查看pip installing in global site-packages instead of virtualenv 的问题(和答案)。

基本上,解决方案包括修改 virtualenv 中 pip 脚本的 shebang,因为它们指向错误的 python 安装(全局而不是 virtualenv 中)。只需将 shebang 更改为指向正确的位置即可。

注意:应归功于提出解决方案的 Chase Ries。

【讨论】:

    【解决方案2】:

    我有同样的问题。它似乎从 Virtualenv 1.11.4 开始得到解决。

    【讨论】: