shell函数如何知道它是否在virtualenv中运行?

时间:2013-03-16 20:10:09

标签: python bash shell virtualenv

bash函数如何测试它是否在Python virtualenv中运行?

我想到的两种方法是:

[[ "$(type -t deactivate)" != function ]]; INVENV=$?

[[ "x$(which python)" != "x$VIRTUAL_ENV/bin/python" ]]; INVENV=$?

(注意:如果我们在virtualenv中,希望$INVENV为1,否则为0,这是迫使上面的向后看测试的原因。)

有什么不那么黑的吗?

3 个答案:

答案 0 :(得分:29)

if [[ "$VIRTUAL_ENV" != "" ]]
then
  INVENV=1
else
  INVENV=0
fi
// or shorter if you like:
[[ "$VIRTUAL_ENV" == "" ]]; INVENV=$?

编辑:正如@ThiefMaster在评论中提到的,在某些条件下(例如,在tmuxscreen中启动新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