Pythonスクリプトからvirtualenvインスタンスをアクティブ化したい。
非常に簡単に実行できることはわかっていますが、これまでに見たすべての例では、これを使用してenv内でコマンドを実行し、サブプロセスを閉じています。
bin / activateと同じように、virtualenvをアクティブにしてシェルに戻りたいだけです。
このようなもの:
$me: my-script.py -d env-name
$(env-name)me:
これは可能ですか?
関連:
Pythonスクリプトからvirtualenvインスタンスをアクティブ化したい。
非常に簡単に実行できることはわかっていますが、これまでに見たすべての例では、これを使用してenv内でコマンドを実行し、サブプロセスを閉じています。
bin / activateと同じように、virtualenvをアクティブにしてシェルに戻りたいだけです。
このようなもの:
$me: my-script.py -d env-name
$(env-name)me:
これは可能ですか?
関連:
回答:
virtualenvでPythonサブプロセスを実行する場合は、virtualenvの/ bin /ディレクトリ内にあるPythonインタープリターを使用してスクリプトを実行することで実行できます。
import subprocess
# 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))
script_file
任意の場所からを実行する方法はありvirtualenv
ますか、それともディレクトリ内にある必要がありますか?
script_file
virtualenvディレクトリにある必要はありません。どこにでも置くことができます。
virtualenvのインタープリターの下でスクリプトを実行する最も簡単な解決策は、スクリプトの最初のように、デフォルトのシバン行をvirtualenvのインタープリターへのパスに置き換えることです。
#!/path/to/project/venv/bin/python
スクリプトを実行可能にします。
chmod u+x script.py
スクリプトを実行します。
./script.py
出来上がり!
はい、問題は単純ではありませんが、解決策は単純です。
まず、「source」コマンドをラップするシェルスクリプトを作成する必要がありました。それは私が「。」を使用したと言った。代わりに、Bashスクリプトのソースよりも使用する方が良いと読んだためです。
#!/bin/bash
. /path/to/env/bin/activate
次に、Pythonスクリプトから、これを簡単に実行できます。
import os
os.system('/bin/bash --rcfile /path/to/myscript.sh')
全体のトリックは--rcfile
議論の中にあります。
Pythonインタープリターが終了すると、アクティブ化された環境に現在のシェルが残ります。
勝つ!
os.system('/bin/bash --rcfile path/to/env/activate')
bashのインスタンスが開始されると、-rcfileの引数として.bashrcが使用されます。したがって、rcfileがアクティブ化ファイルであることを指定するだけです...いいえ?
cat ~/.bashrc env/bin/activate > env/bin/activate2 && /bin/bash --rcfile env/bin/activate2
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
私のために働くただ簡単な解決策。基本的に役に立たないステップを実行するBashスクリプトが必要な理由がわかりません(私は間違っていますか?)
import os
os.system('/bin/bash --rcfile flask/bin/activate')
これは基本的にあなたが必要とすることをします:
[hellsing@silence Foundation]$ python2.7 pythonvenv.py
(flask)[hellsing@silence Foundation]$
次に、仮想環境を非アクティブ化する代わりに、Ctrl+Dまたは終了します。それは可能な解決策ですか、それともあなたが望んでいたものではありませんか?
子プロセス環境は、存在しなくなった瞬間に失われ、環境コンテンツをそこから親に移動するのはやや注意が必要です。
おそらく、virtualenv環境変数をファイルに出力するシェルスクリプト(動的に/ tmpに生成できます)を生成する必要があります。このスクリプトは、親Pythonプロセスで読み取られ、os.environに配置されます。
または、open( "bin / activate")の行に使用するアクティベートスクリプトを解析し、手動で抽出して、os.environに配置します。トリッキーですが、不可能ではありません。
一番上の答えは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))
のように、すべてvirtualenv
を1つのフォルダに作成する必要がありますvirt
。
virtualenvフォルダー名がvirtであると仮定し、変更しない場合
cd
mkdir custom
以下の行をコピーしてください...
#!/usr/bin/env bash
ENV_PATH="$HOME/virt/$1/bin/activate"
bash --rcfile $ENV_PATH -i
シェルスクリプトファイルを作成し、上記の行を貼り付けます...
touch custom/vhelper
nano custom/vhelper
ファイルに実行可能権限を付与します。
sudo chmod +x custom/vhelper
次に、そのカスタムフォルダパスをエクスポートして、タブをクリックしてコマンドラインで見つけられるようにします...
export PATH = $ PATH: "$ HOME / custom"
以下のコマンドを入力するだけで、どこからでも使用できます...
vhelper YOUR_VIRTUAL_ENV_FOLDER_NAME
それがabcだとしましょう...
vhelper abc
subprocess.Popen([venv_python_file, script_file])
?