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$
私は何を間違えていますか?
ソースを作成すると、アクティブ化スクリプトがアクティブシェルに読み込まれます。
スクリプトで実行すると、そのシェルに読み込まれ、スクリプトが終了すると終了し、元のアクティブ化されていないシェルに戻ります。
あなたの最良のオプションは、関数でそれをすることです
activate () {
. ../.env/bin/activate
}
またはエイリアス
alias activate=". ../.env/bin/activate"
お役に立てれば。
ソースを使用して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
そこに行くと、シェル表示がプロンプトに表示されます。
シェルプロンプトに "(.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
ソーシングは、現在のシェルでシェルコマンドを実行します。上記のようにスクリプト内でソースを作成すると、そのスクリプトの環境に影響を与えますが、スクリプトが終了すると、環境の変更は元に戻されます。
Virtualenvでシェルコマンドを実行することを目的とする場合は、アクティベートスクリプトを取得した後、スクリプトで実行できます。 virtualenv内のシェルと対話することが目的の場合、環境内を継承するサブシェルをスクリプト内に生成できます。
サブシェルを使用してこれを行うことで、使用法をより適切に含めることもできます。実際の例を次に示します。
#!/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
に存在しますこれは私がよく使うスクリプトです
#!/bin/bash -x
PWD=`pwd`
/usr/local/bin/virtualenv --python=python3 venv
echo $PWD
activate () {
. $PWD/venv/bin/activate
}
activate
Bashスクリプトのソースは何のためですか?
複数のvirtualenvを切り替えるか、1つのvirtualenvをすばやく入力する場合、virtualenvwrapper
を試しましたか? workon venv
、mkvirtualenv venv
などのような多くのユーティリティを提供します。
特定のvirtualenvでpythonスクリプトを実行する場合は、/path/to/venv/bin/python script.py
を使用して実行してください。
1行で複数のコマンドを使用する必要があります。例えば:
os.system(". Projects/virenv/bin/activate && python Projects/virenv/Django-project/manage.py runserver")
仮想環境を1行でアクティブにすると、他のコマンドラインを忘れてしまい、1行で複数のコマンドを使用してこれを防ぐことができると思います。それは私のために働いた:)