web-dev-qa-db-ja.com

Bashスクリプトでvirtualenvをアクティブ化する方法

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$ 

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

74
Cerin

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

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

あなたの最良のオプションは、関数でそれをすることです

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

またはエイリアス

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

お役に立てれば。

58
richo

ソースを使用して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

そこに行くと、シェル表示がプロンプトに表示されます。

45
Flavio Garcia

シェルプロンプトに "(.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
13
Cerin

ソーシングは、現在のシェルでシェルコマンドを実行します。上記のようにスクリプト内でソースを作成すると、そのスクリプトの環境に影響を与えますが、スクリプトが終了すると、環境の変更は元に戻されます。

Virtualenvでシェルコマンドを実行することを目的とする場合は、アクティベートスクリプトを取得した後、スクリプトで実行できます。 virtualenv内のシェルと対話することが目的の場合、環境内を継承するサブシェルをスクリプト内に生成できます。

8
zigg

サブシェルを使用してこれを行うことで、使用法をより適切に含めることもできます。実際の例を次に示します。

#!/bin/bash

commandA --args

# Run commandB in a subshell and collect its output in $VAR
VAR=$(
    PATH=$PATH:/opt/bin
    . /path/to/activate > /dev/null
    commandB  # tool from /opt/bin that requires virtualenv
)

# Use the output of the commandB later
commandC "${VAR}"

このスタイルは、次の場合に特に役立ちます。

  • commandAまたはcommandB/opt/binに存在します
  • これらのコマンドはvirtualenvで失敗します
  • さまざまな異なる仮想環境が必要です
1
ti7

これは私がよく使うスクリプトです

#!/bin/bash -x
PWD=`pwd`
/usr/local/bin/virtualenv --python=python3 venv
echo $PWD
activate () {
    . $PWD/venv/bin/activate
}

activate
0
Sand1512

Bashスクリプトのソースは何のためですか?

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

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

0
iMom0

1行で複数のコマンドを使用する必要があります。例えば:

os.system(". Projects/virenv/bin/activate && python Projects/virenv/Django-project/manage.py runserver")

仮想環境を1行でアクティブにすると、他のコマンドラインを忘れてしまい、1行で複数のコマンドを使用してこれを防ぐことができると思います。それは私のために働いた:)