36

bash関数が Python virtualenv 内で実行されているかどうかをどのようにテストする必要がありますか?

頭に浮かぶ2つのアプローチは次のとおりです。

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

また

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

(注: $INVENVvirtualenv 内にいる場合は 1 になり、それ以外の場合は 0 になりたいのは、上記の後方参照テストを強制するものです。)

ハックが少ないものはありますか?

4

3 に答える 3

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

EDIT : @ThiefMaster がコメントで言及しているように、特定の条件 (たとえば、アクティブな virtualenv 内tmuxまたはscreen内から新しいシェルを開始するとき) では、このチェックが失敗する場合があります (ただし、virtualenv 内から新しいシェルを開始すると、他の問題もありますので、お勧めしません)。

于 2013-03-16T20:20:04.563 に答える
19

実際、私は同様の質問を見つけました。そこから、この質問に対する答えを簡単に導き出すことができます。

Python: virtualenv 内で実行されているかどうかを判断する

たとえば、シェルスクリプトは次のようなものを使用できます

python -c 'import sys; print (sys.real_prefix)' 2>/dev/null && INVENV=1 || INVENV=0

(このソリューションを Python 3 でも動作させる方法を示してくれた Christian Long に感謝します。)

編集:これは、より直接的な(したがって、より明確でクリーンな)解決策です(JuanPabloのコメントからヒントを得ています):

INVENV=$(python -c 'import sys; print ("1" if hasattr(sys, "real_prefix") else "0")')
于 2013-03-16T21:28:41.390 に答える
1

virtualenvwrappers を使用する場合、INVENV を設定できる pre/post スクリプトが実行されます。

または、私がしていることは、.bashrcに次を入れて、作業ディレクトリ(django用)に.venvというファイルを作成して、ディレクトリにcdしたときに仮想envが自動的にロードされるようにすることです

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
于 2013-03-16T20:40:10.000 に答える