Python virtualenvwrapper:'workon' 无法结束

3 投票
2 回答
907 浏览
提问于 2025-04-18 18:28

标题基本上已经说明了问题。我尝试使用 workon $SOME_VIRTUALENV 命令时,它会回显这个命令,然后在高 CPU 使用率(大约 70%)的情况下无限期挂起,直到我用 kill -9 强制结束它。我的操作系统是 OS X Mavericks。

我查了一下,发现大多数类似的问题都是那些使用 zsh 的人遇到的(而我不是),而且他们在输入虚拟环境名称时会崩溃(我也没有这个问题),所以我有点无从下手。我知道信息不多,但我也不是 bash 专家,如果能给我一些获取真实诊断信息的建议,我会非常感激。

$ echo $OSTYPE
darwin13.1.0

$ echo $SHELL
usr/local/bin/bash

$ echo $BASH_VERSION
4.0.0(1)-release

$ which python
/usr/local/bin/python

$ python --version
Python 2.7.8

$ pip show virtualenv
---
Name: virtualenv
Version: 1.11.6
Location: /usr/local/lib/python2.7/site-packages
Requires:

$ pip show virtualenvwrapper
---
Name: virtualenvwrapper
Version: 4.3.1
Location: /usr/local/lib/python2.7/site-packages
Requires: virtualenv, virtualenv-clone, stevedore

.bashrc 文件(大致是从某个地方复制粘贴过来的):

# Locate virtualenvwrapper binary
if [ -f /usr/local/bin/virtualenvwrapper.sh ]; then
    export VENVWRAP=/usr/local/bin/virtualenvwrapper.sh
fi

if [ ! -z $VENVWRAP ]; then
    # virtualenvwrapper -------------------------------------------
    # make sure env directory exists; else create it
    [ -d $HOME/sites/env ] || mkdir -p $HOME/sites/env
    export WORKON_HOME=$HOME/sites/env
    source $VENVWRAP

    # virtualenv --------------------------------------------------
    export VIRTUALENV_USE_DISTRIBUTE=true

    # pip ---------------------------------------------------------
    export PIP_VIRTUALENV_BASE=$WORKON_HOME
    export PIP_REQUIRE_VIRTUALENV=false
    export PIP_RESPECT_VIRTUALENV=true
    export PIP_DOWNLOAD_CACHE=$HOME/.pip/cache
fi

2 个回答

0

如果你不确定自己在bashrc文件里放了什么,就不要放进去。可能是路径设置得不对,这才导致一切都卡住了。

可以尝试把里面的内容注释掉。

按照这里的步骤操作:http://virtualenvwrapper.readthedocs.org/en/latest/install.html,或者运行这个命令:locate virtualenvwrapper.sh

你得到的路径是你需要的。接着编辑你的.bashrc文件,添加以下内容:

source /你之前得到的路径/virtualenvwrapper.sh

修改后保存并关闭文件,然后执行:

source .bashrc

(可能你还需要配置一下WORKON_HOME,我记不太清楚了)看看有没有什么变化。

如果没有变化,试着创建一个新的虚拟环境。

1

为了将来能帮助到其他人,我来分享一下我的经历:

我最终找到了这个问题的根源,虽然不知道具体原因。是虚拟环境管理工具virtualenvwrapper的自定义补全功能出了大问题;每当我尝试用Tab键补全workon命令时,接下来输入的命令就会出现之前提到的问题。即使我按下Ctrl-C取消了补全的命令,重新输入一个全新的命令,问题依然存在。

所以,我决定不再使用workon的补全功能,并且把virtualenvwrapper.sh文件中virtualenvwrapper_setup_tab_completion这个函数的内容删掉,换成一个什么都不做的true,这样就不会不小心使用补全了。

我本可以更深入地研究一下为什么补全会导致这个问题,但现在觉得没必要。还有一些其他人也遇到过virtualenvwrapper的补全问题,我看到的情况是他们在尝试使用时,终端直接崩溃了,而我这里并没有发生这种情况。

撰写回答