bash
函数如何测试它是否在Python virtualenv中运行?
我想到的两种方法是:
[[ "$(type -t deactivate)" != function ]]; INVENV=$?
或
[[ "x$(which python)" != "x$VIRTUAL_ENV/bin/python" ]]; INVENV=$?
(注意:如果我们在virtualenv中,希望$INVENV
为1,否则为0,这是迫使上面的向后看测试的原因。)
有什么不那么黑的吗?
答案 0 :(得分:29)
if [[ "$VIRTUAL_ENV" != "" ]]
then
INVENV=1
else
INVENV=0
fi
// or shorter if you like:
[[ "$VIRTUAL_ENV" == "" ]]; INVENV=$?
编辑:正如@ThiefMaster在评论中提到的,在某些条件下(例如,在tmux
或screen
中启动新shell时 - 可能来自active virtualenv)这个检查可能会失败(但是,从virtualenv中启动新的shell也可能会导致其他问题,我不推荐它。)
答案 1 :(得分:15)
实际上,我刚刚发现了一个类似的问题,从中可以很容易地找到答案:
Python: Determine if running inside virtualenv
例如,shell脚本可以使用类似
的内容python -c 'import sys; print (sys.real_prefix)' 2>/dev/null && INVENV=1 || INVENV=0
(感谢Christian Long展示如何使这个解决方案也适用于Python 3。)
编辑:这是一个更直接(更清晰,更清晰)的解决方案(从JuanPablo的评论中得到启示):
INVENV=$(python -c 'import sys; print ("1" if hasattr(sys, "real_prefix") else "0")')
答案 2 :(得分:1)
如果您使用virtualenvwrappers,则会运行可以为您设置INVENV的前/后脚本。
或者我做了什么,将以下内容放在您的.bashrc中,并在您的工作目录中创建一个名为.venv的文件(对于django),以便在您进入目录时自动加载虚拟环境
export PREVPWD=`pwd`
export PREVENV_PATH=
handle_virtualenv(){
if [ "$PWD" != "$PREVPWD" ]; then
PREVPWD="$PWD";
if [ -n "$PREVENV_PATH" ]; then
if [ "`echo "$PWD" | grep -c $PREVENV_PATH`" = "0" ]; then
deactivate
unalias python 2> /dev/null
PREVENV_PATH=
fi
fi
# activate virtualenv dynamically
if [ -e "$PWD/.venv" ] && [ "$PWD" != "$PREVENV_PATH" ]; then
PREVENV_PATH="$PWD"
workon `basename $PWD`
if [ -e "manage.py" ]; then
alias python='python manage.py shell_plus'
fi
fi
fi
}
export PROMPT_COMMAND=handle_virtualenv