我正在寻找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中呢?
答案 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)
如果我理解正确,则函数workon
由virtualenvwrapper
定义。在尝试source
包装器之前,您可以检查函数是否已定义。
将source
命令替换为以下内容:
[[ $(type -t workon) == "function" ]] || source /etc/bash_completion.d/virtualenvwrapper