我使用Macports在我的Mac上安装了各种版本的python。当我通过$ port select python python27
选择了python 2.7时,virtualenvwrapper非常有效。
但如果我选择另一个版本的python,即2.6,virtualenvwrapper会生成一条错误消息:ImportError:没有名为virtualenvwrapper.hook_loader的模块
我检查了我的.profile,它将VIRTUALENVWRAPPER_PYTHON
设置为/opt/local/bin/python
,所以在我看来,无论我选择了哪个python,virtualenvwrapper都应该正常工作。
在切换python版本时,有什么想法会导致virtualenvwrapper生成.hook_loader错误吗?
答案 0 :(得分:29)
我知道这在你的评论中已经解决了,但它只是mac,
甚至更多我认为正确的方法应该是将VIRTUALENVWRAPPER_PYTHON
设置为您在命令行中使用的真实python。
确保您可以执行which python
。
实际上,你甚至可以这样做:
export VIRTUALENVWRAPPER_PYTHON=`which python`
在Linux上我在.bashrc中这样做,所以总而言之,假设你安装了virtualenv并创建了你的第一个“虚拟环境”virtualenv
(原创)
. virtualenv/bin/activate
export WORKON_HOME=$HOME/.virtualenvs # or whatever else you want
export VIRTUALENVWRAPPER_PYTHON=`which python`
export PROJECT_HOME=SOMETHING
source $HOME/virtualenv/bin/virtualenvwrapper.sh # or wherever else you got that installed
(顺便说一下,你写道:
我检查了我的.profile并且它将VIRTUALENVWRAPPER_PYTHON设置为/ opt / local / bin / python,所以在我看来virtualenvwrapper无论我选择哪个python都应该工作
实际上是相反的 - virtualenv依赖于使用正确的python(以及随之而来的包),因此相应地设置python路径非常重要。
即使运行带有“#!/ bin / python”的py文件,一旦你被虚拟化,也可能会带来麻烦!
答案 1 :(得分:14)
这些都没有奏效。我在设置我的osx机器时首先安装了Python3,并且pip都默认为。
首先,检查你安装了哪个python:
$ `which python` -V
如果返回" Python 2.7.12",则设置为运行:
$ mkvirtualenv -p `which python` api_server
Running virtualenv with interpreter /usr/local/bin/python
New python executable in /Users/eric/.virtualenvs/api_server/bin/python2.7
Also creating executable in /Users/eric/.virtualenvs/api_server/bin/python
Installing setuptools, pip, wheel...done.
virtualenvwrapper.user_scripts creating /Users/eric/.virtualenvs/api_server/bin/predeactivate
virtualenvwrapper.user_scripts creating /Users/eric/.virtualenvs/api_server/bin/postdeactivate
virtualenvwrapper.user_scripts creating /Users/eric/.virtualenvs/api_server/bin/preactivate
virtualenvwrapper.user_scripts creating /Users/eric/.virtualenvs/api_server/bin/postactivate
virtualenvwrapper.user_scripts creating /Users/eric/.virtualenvs/api_server/bin/get_env_details
这也会激活api_server
工作,这会改变你的python可执行文件:
$ which python
/Users/eric/.virtualenvs/api_server/bin/python
$ python -V
Python 2.7.12
which python
实际上做了什么?它输出在PATH中找到的python可执行文件的目录:
$ which python
/usr/local/bin/python
使用which python
,您基本上将/usr/local/bin/python
传递到mkvirtualenv目录中的-p
选项。
在which python
中返回多个python可执行文件时会发生什么?找到你想要的那个并传递它:
$ mkvirtualenv -p /usr/local/bin/python3 api_server
而virtualenvwrapper将最终使用该python可执行文件。
答案 2 :(得分:8)
确认使用两个同名的环境变量:
VIRTUALENVWRAPPER_PYTHON
- virtualenvwrapper实用程序本身使用哪个Python版本。换句话说,哪个版本的Python执行virtualenvwrapper
,就好像已经在virtualenvwrapper脚本文件的#!
行中明确命名了Python版本。
VIRTUALENV_PYTHON
- 创建新虚拟环境时virtualenv
将安装哪个Python版本。等同于-p / --python
命令行上的virtualenv
选项。
也许显然:)在虚拟环境中运行的Python版本是您为该环境安装的版本 - 在创建env之后与上述环境变量无关。
有关如何在virtualenv中升级Python,请参阅https://stackoverflow.com/a/24724360/763269。
答案 3 :(得分:2)
您可以显式选择python版本
mkvirtualenv -p python3 venvname
或
mkvirtualenv -p python2.7 venvname
答案 4 :(得分:-1)
你(OP)似乎已经用python2.7安装了virtualenv和virtualenvwrapper,而不是用python2.6。如果在你的shell加载virtualenvwrapper.sh脚本的那一刻调用了python2.6,那就不高兴了。很简单。
VIRTUALENVWRAPPER_PYTHON
是针对这些情况而制作的。有了它,你可以确保你总是使用正确版本的python,而不必总是添加-p /path/to/python2.7
所以,我不同意Stefano在这种情况下的答案,在OP的情况下,你应该在你的.bashrc中清楚地解释使用哪个python:
...
export VIRTUALENVWRAPPER_PYTHON=/path/to/your/python2.7
source /path/to/bin/virtualenvwrapper.sh
就像那样它应该一直都好! Virtualenvwrapper旨在简化事情。
另请注意,/opt/local/bin/python
必须是您使用port python select
选择的python版本的符号链接(请与ls -l /opt/local/bin/python
一起检查以确定)。