web-dev-qa-db-ja.com

Pythonスクリプトでvirtualenvをアクティブ化する

Pythonスクリプトからvirtualenvインスタンスをアクティブ化したい。

私はそれが非常に簡単であることを知っていますが、私が見たすべての例はそれを使用してenv内でコマンドを実行し、サブプロセスを閉じます。

Bin/activateと同じように、virtualenvをアクティブにしてシェルに戻りたいだけです。

このようなもの:

$me: my-script.py -d env-name
$(env-name)me:

これは可能ですか?

関連:

virtualenv›スクリプトからenvを呼び出す

76
h3.

Virtualenvの下でPythonサブプロセスを実行したい場合は、virtualenvの/ bin /ディレクトリ内にあるpythonインタープリターを使用してスクリプトを実行することにより、 :

# path to a python interpreter that runs any python script
# under the virtualenv /path/to/virtualenv/
python_bin = "/path/to/virtualenv/bin/python"

# path to the script that must run under the virtualenv
script_file = "must/run/under/virtualenv/script.py"

subprocess.Popen([python_bin, script_file])

ただし、サブプロセスではなく現在のpythonインタープリターでvirtualenvをアクティブにしたい場合は、activate_this.py 脚本:

# doing execfile() on this file will alter the current interpreter's
# environment so you can import libraries in the virtualenv
activate_this_file = "/path/to/virtualenv/bin/activate_this.py"

execfile(activate_this_file, dict(__file__=activate_this_file))
69
Lie Ryan

Virtualenvのインタープリターの下でスクリプトを実行する最も簡単な解決策は、スクリプトの先頭で、デフォルトのShebang行をvirtualenvのインタープリターへのパスに置き換えることです。

#!/path/to/project/venv/bin/python

スクリプトを実行可能にします。

chmod u+x script.py

スクリプトを実行します。

./script.py

出来上がり!

20
nafooesi

はい、問題は単純ではありませんが、解決策はそうです。

最初に、「ソース」コマンドをラップするシェルスクリプトを作成する必要がありました。つまり、「。」を使用しました。代わりに、bashスクリプトのソースよりも使用する方が良いと読んだためです。

#!/bin/bash
. /path/to/env/bin/activate

その後、私のpythonスクリプトから私はこれを簡単に行うことができます:

import os
os.system('/bin/bash --rcfile /path/to/myscript.sh')

トリック全体は--rcfile引数内にあります。

pythonインタープリターが終了すると、現在のシェルはアクティブ化された環境に残ります。

勝つ!

20
h3.

公式の Virtualenvドキュメント に従って別のPython環境を実行するには、コマンドラインで実行可能ファイルへのフルパスを指定できますpython =バイナリ、それだけ(前にvirtualenvをアクティブにする必要はありません):

/path/to/virtualenv/bin/python

Virtualenvを使用してコマンドラインからスクリプトを呼び出す場合も同じことが当てはまります。事前にスクリプトをアクティブにする必要はありません。

me$ /path/to/virtualenv/bin/python myscript.py

Windows環境でも同じです(コマンドラインからでも、スクリプトからでも):

> \path\to\env\Scripts\python.exe myscript.py
9
Mariano Ruiz

私のために働くだけのシンプルなソリューション。基本的に役に立たないステップを実行するbashスクリプトが必要な理由がわかりません(私は間違っていますか?)

import os
os.system('/bin/bash  --rcfile flask/bin/activate')

基本的にあなたが必要なことをします:

[hellsing@silence Foundation]$ python2.7 pythonvenv.py 
(flask)[hellsing@silence Foundation]$ 

次に、venvを非アクティブ化する代わりに、Ctrl + Dまたは終了するだけです。
それは可能な解決策ですか、それともあなたが望んでいたものではありませんか?

6
Depado

子プロセスenvは存在しなくなった時点で失われ、そこから環境コンテンツを親に移動するのはやや注意が必要です。

おそらく行う必要があるのは、virtualenv環境変数をファイルに出力するシェルスクリプト(/ tmpに動的に生成することができます)を生成することです。その後、親Pythonプロセスos.environに配置します。

または、単にopen( "bin/activate")のfor行を使用してactivateスクリプトを解析し、手動で内容を抽出してos.environに配置します。トリッキーですが、不可能ではありません。

2
Mikko Ohtamaa

トップアンサーはpython2.xでのみ機能します

Python 3.xはこれを使用します。

activate_this_file = "/path/to/virtualenv/bin/activate_this.py"

exec(compile(open(activate_this_file, "rb").read(), activate_this_file, 'exec'), dict(__file__=activate_this_file))

参照: Python 3? のexecfileに代わるものは何ですか?)==

0
Asaad