在bash中获取virtualenvwrapper命令之前,如何检查我是不是在使用virtualenv?

时间:2013-10-15 08:20:06

标签: bash virtualenvwrapper

我正在寻找virtualenvwrapper so that I can use virtualenvwrapper functions in a bash script,如下面的简化示例所示:

正在运行do_some ve_name branch_name次来电:

#! /bin/bash
# some script that takes parameters

source /etc/bash_completion.d/virtualenvwrapper # the magic of sourcing
workon $1 # pick a venv
cd /some/project/path
git checkout $2 # pick a branch
python do_something.py

这有效(我不介意一旦结束就退出虚拟环境,实际上我更喜欢它)。但是,如果我已经在虚拟环境中,我会收到以下信息:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named virtualenvwrapper.hook_loader
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=/home/username/.virtualenvs/ve_name/bin/python and that PATH is set properly.
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named virtualenvwrapper.hook_loader
    Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: No module named virtualenvwrapper.hook_loader

所以,让我们假设我偶尔会忘记停用当前的virtualenv。我尝试解决这个问题如下:

#! /bin/bash
# some advanced script that takes parameters

deactivate
source /etc/bash_completion.d/virtualenvwrapper # the magic of sourcing
workon $1 # pick a venv
...

但无论我目前是否在使用virtualenv,我都会收到以下错误(如果我偶然出现在virtualenv中,它就不会停用,这是我想要解决的问题):

/path/to/scripts/do_some: line 4: deactivate: command not found

那么,在采购virtualenvwrapper命令之前,如何防止已经存在于virtualenv中呢?

2 个答案:

答案 0 :(得分:2)

您也可以尝试使用VIRTUAL_ENV环境变量。在查看之后我发现这是一个更清晰的解决方案,所以我想我会留下一个注释,以防其他人在寻找类似的解决方案。

如,

if [ ${VIRTUAL_ENV} ]
    then
        # do some stuff
fi

以下是deactivate脚本中activate函数的相关部分:

# (inside deactivate function)
unset VIRTUAL_ENV
if [ ! "$1" = "nondestructive" ] ; then
# Self destruct!
    unset -f deactivate
fi

以下是最初源文件时的设置方法:

# (runs when you source the activate file)
VIRTUAL_ENV="/path/to/venv/dir"
export VIRTUAL_ENV

这可能无法解决原始问题(没有测试),但它对于大部分案例有帮助,您只需要知道自己是否属于虚拟语言。

答案 1 :(得分:1)

如果我理解正确,则函数workonvirtualenvwrapper定义。在尝试source包装器之前,您可以检查函数是否已定义。

source命令替换为以下内容:

[[ $(type -t workon) == "function" ]] || source /etc/bash_completion.d/virtualenvwrapper