在virtualenvwrapper.sh中的哪个python`在arch linux中搞砸了

时间:2012-04-13 04:49:11

标签: python-2.x archlinux virtualenvwrapper

在arch linux上,在系统范围内安装virtualenvwrapper后,通过sudo pip2 install virtualenvwrapper并将其添加到我的用户的.bash_profile中,

 export WORKON_HOME=/home/myuser/.virtualenvs
 export PROJECT_HOME=/home/myuser/work
 source /usr/bin/virtualenvwrapper.sh

每当我启动一个新的shell窗口时都会出现错误: -

which: no python in (/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/bin/core_perl)
-bash: : command not found
virtualenvwrapper.sh: There was a problem running the initialization hooks. If Python could not import the module virtualenvwrapper.hook_loader, check that virtualenv has been installed for VIRTUALENVWRAPPER_PYTHON= and that PATH is set properly.

这可以追溯到virtualenvwrapper.sh脚本中的第50行: -

 47 # Locate the global Python where virtualenvwrapper is installed. 
 48 if [ "$VIRTUALENVWRAPPER_PYTHON" = "" ] 
 49 then 
 50     VIRTUALENVWRAPPER_PYTHON="$(\which python)" 
 51 fi 

与arch linux使用python2进行python 2.7安装的惯例冲突的结果。

如果我将第50行修改为which python2,一切都很完美,每当我启动一个新shell时,我都不会看到错误消息。

解决此问题的适当方法是什么?我是否写了一个明确的检查,当前操作系统是arch linux并引入了if-else条件,以便在virtualenvwrapper.sh中使用哪个python2并将补丁发送给virtualenvwrapper作者?或者我的arch linux机器中的配置是否可以做些什么?

3 个答案:

答案 0 :(得分:3)

Virtualenvwrapper有变量VIRTUALENVWRAPPER_PYTHONVIRTUALENVWRAPPER_VIRTUALENV,它们指向你的python和virtualenv可执行文件。所以,在你的.bash_profile中你可以写出类似的内容:

export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python2
export VIRTUALENVWRAPPER_VIRTUALENV=/usr/bin/virtualenv2
source /usr/bin/virtualenvwrapper.sh

答案 1 :(得分:2)

为了回答这个特定于arch的python怪癖(使用python2的惯例),我特意创建了一个这样的软链接: -

ln -s /usr/bin/python2 /usr/local/bin/python

由于/usr/local/bin位于bash系统PATH环境变量中/usr/bin之前,当我键入python时,或者当virtualenvwrapper.sh脚本引用第50行中的which python时,我们将不再遇到上面提到的virtualenvwrapper冲突,一切都按预期工作。

这样做的缺点是它可能搞乱了“python 3”(被认为是默认的python命令)常规,而linux是专为此而设计的。因此,我必须小心,不要在目标框中使用与python 3相关的python 3相关库或软件包安装。

答案 2 :(得分:1)

我发现无需编辑/usr/bin/virtualenvwrapper.sh脚本或创建新的符号链接。我只是错过了python2的virtualenvwrapper模块。我安装它如下:

pip2 install virtualenvwrapper

并保持出口,以便完成魔术。