144

Python virtualenv を有効にする Bash スクリプトを作成するにはどうすればよいですか?

次のようなディレクトリ構造があります。

.env
    bin
        activate
        ...other virtualenv files...
src
    shell.sh
    ...my code...

次の方法で virtualenv をアクティブ化できます。

user@localhost:src$ . ../.env/bin/activate
(.env)user@localhost:src$

ただし、Bash スクリプトから同じことを行っても何も起こりません。

user@localhost:src$ cat shell.sh
#!/bin/bash
. ../.env/bin/activate
user@localhost:src$ ./shell.sh
user@localhost:src$ 

私は何を間違っていますか?

4

10 に答える 10

105

ソースを作成すると、アクティブ化スクリプトがアクティブ シェルに読み込まれます。

スクリプトで実行すると、そのシェルに読み込まれ、スクリプトが終了すると終了し、元のアクティブ化されていないシェルに戻ります。

あなたの最善の選択肢は、関数でそれを行うことです

activate () {
  . ../.env/bin/activate
}

またはエイリアス

alias activate=". ../.env/bin/activate"

お役に立てれば。

于 2012-10-29T13:02:45.787 に答える
90

ソースを使用して bash スクリプトを呼び出す必要があります。

次に例を示します。

#!/bin/bash
# Let's call this script venv.sh
source "<absolute_path_recommended_here>/.env/bin/activate"

シェルでは、次のように呼び出します。

> source venv.sh

または@outmindが示唆したように:(これはzshでは機能しないことに注意してください)

> . venv.sh

これで、シェル表示がプロンプトに配置されます。

于 2016-02-02T14:53:54.733 に答える
17

シェル プロンプトに「(.env)」プレフィックスは追加されませんが、このスクリプトは期待どおりに動作することがわかりました。

#!/bin/bash
script_dir=`dirname $0`
cd $script_dir
/bin/bash -c ". ../.env/bin/activate; exec /bin/bash -i"

例えば

user@localhost:~/src$ which pip
/usr/local/bin/pip
user@localhost:~/src$ which python
/usr/bin/python
user@localhost:~/src$ ./shell
user@localhost:~/src$ which pip
~/.env/bin/pip
user@localhost:~/src$ which python
~/.env/bin/python
user@localhost:~/src$ exit
exit
于 2012-10-29T14:46:36.390 に答える
11

Sourcing は、現在のシェルでシェル コマンドを実行します。上記のようにスクリプト内でソースを取得すると、そのスクリプトの環境に影響を与えますが、スクリプトが終了すると、環境の変更は事実上範囲外になるため元に戻されます。

virtualenv でシェル コマンドを実行することが目的の場合は、activate スクリプトをソースした後にスクリプトで実行できます。virtualenv 内のシェルと対話することが意図されている場合は、環境を継承するスクリプト内にサブシェルを生成できます。

于 2012-10-29T13:04:41.043 に答える
3

bash スクリプトを調達する目的は何ですか?

  1. 複数の virtualenv を切り替えるか、1 つの virtualenv にすばやく入る場合は、試しましたvirtualenvwrapperか? workon venvなどの多くのユーティリティを提供しmkvirtualenv venvます。

  2. 特定の virtualenv で python スクリプトを実行するだけの場合は、 を使用/path/to/venv/bin/python script.pyして実行します。

于 2012-10-29T13:18:20.263 に答える