web-dev-qa-db-ja.com

python)を使用して異なるvirtualenv内でサブプロセスを実行する

2つの異なる仮想環境に2つの異なるバージョンのアプリをインストールしているとしましょう。 myappv1.0およびmyappv2.0。

それでは、それらを比較したいと思います。比較はpython自体で記述されています。これを行うための最良の方法は何でしょうか?それらを別々に実行し、両方が出力ファイルを書き込んで、後で比較できると仮定しましょう。

そのための1つの方法は、bashスクリプトを作成することです(これは私が現在持っているものです)。 1つのvirtualenvをアクティブ化し、myapp v1.0を実行し、別のvirtualenvをアクティブ化し、myappv2.0を実行します。後でそれらのファイルに対して比較モジュールを実行します。しかし、Pythonで簡単になるダイナミクスをいくつか追加したいと思います(オプションの引数を取るなど)。

編集:

現在、私はそのようなものを持っています(bashスクリプト):

source virtualenv1/bin/activate
python my_script.py
deactivate

source virtualenv2/bin/activate
python my_other_script.py
deactivate

python my_comparison_script.py

代わりに、私は次のことだけをしたいと思います。

python my_comparison_script.py

私のスクリプトはこの中で実行されます。

27
Ago

受け入れられた答えは、サブプロセスでvirtualenvを「アクティブ化」する問題に対処していません。

あなたの例のように、python実行可能ファイルの呼び出しでアプリケーションを開始する場合、それは実際には非常に単純です。virtualenv内の実行可能ファイルを明示的に指すだけです。

import subprocess

subprocess.Popen(["virtualenv1/bin/python", "my_script.py"])
subprocess.Popen(["virtualenv2/bin/python", "my_other_script.py"])

それぞれのvirtualenvsでプロセスを開始します。

重要

コメントで表明された懸念に対処するには:

サブプロセスを実行する場合は、必ず同じインタープリターを使用して、現在のプロセスが実行されていることを確認する必要があります sys.executable 。また利用可能: sys.exec_prefix プラットフォームに依存するPythonファイルがインストールされているサイト固有のディレクトリプレフィックスにアクセスします。

このトピックについてさらに詳しく説明したい場合は、これをご覧ください プルリクエスト

33

簡単なオプションは、次のようにサブプロセスを使用して一連のコマンドを実行することです。

import subprocess

subprocess.call('source activate my_virtualenv; python my_script.py', Shell=True)

そして、必要に応じて繰り返します。

2
fiskhe

virtualenvのドキュメントでうまく説明されていると思います。

TL; DR

Runnig python venvバイナリは直接[〜#〜] not [〜#〜]venvのアクティブ化と同じです。また、それに応じて[〜#〜] path [〜#〜]変数とVIRTUAL_ENV変数を変更する必要があります( osを見てください) .environ

ソース

$ source/path/to/ENV/bin/activate

これにより$ PATHが変更されるため、最初のエントリはvirtualenvのbin /ディレクトリになります。 (シェル環境がインプレースで変更されるため、ソースを使用する必要があります。)これですべてです。純粋に便利です。

Virtualenvのbin /ディレクトリからスクリプトまたはpythonインタプリタ)を直接実行する場合(例:path/to/ENV/bin/pipまたは/ path/to/ENV/bin/python-script。 py)次に、sys.pathは、virtualenvに関連付けられたPythonライブラリを使用するように自動的に設定されます。ただし、アクティベーションスクリプトとは異なり、環境変数PATHおよびVIRTUAL_ENVは変更されません。つまり、 Pythonスクリプトが、たとえばサブプロセスを使用して別のPythonスクリプトを実行する場合(たとえば、!/ usr/bin/env python = Shebang line)2番目のスクリプトは最初のスクリプトと同じPythonバイナリで実行することも、同じライブラリを使用することもできません。これを回避するには、最初のスクリプトで環境を変更する必要があります。 2番目のスクリプトが実行される前に、アクティベーションスクリプトと同じ方法で変数。

1
eleksis