2

次の簡単な例のように、bash スクリプトで virtualenvwrapper 関数を使用できるように、 virtualenvwrapper を調達しています。

実行中の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

したがって、現在の仮想環境を無効にするのを時々忘れると仮定しましょう。私はこれを次のように解決しようとしました:

#! /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 にいることを防ぐにはどうすればよいでしょうか?

4

2 に答える 2

3

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

これは元の質問を解決しない可能性があります (テストしませんでした) が、virtualenv にいるかどうかを知る必要がある場合の大きなサブセットには役立ちます。

于 2014-11-18T03:23:16.437 に答える
1

私がそれを正しく理解していれば、関数workonは によって定義されていvirtualenvwrapperます。sourceラッパーを試みる前に、関数が定義されているかどうかを確認できます。

sourceコマンドを次のように置き換えます。

[[ $(type -t workon) == "function" ]] || source /etc/bash_completion.d/virtualenvwrapper
于 2013-10-15T08:30:40.397 に答える