2016-09-26 15 views
0

私はvirutalenvを作成してインストールしました。私はまた、私のvirutal環境の中にjsnapyツールをインストールしました。Pythonを使用して仮想環境内でコマンドを実行する方法

これは、我々が使用しているスクリプトです:私たちは、virutalenvに入るのコマンドを実行して、Pythonスクリプトを使用して、それを無効にする方法

Filename : venv.py 
import os 
os.system('/bin/bash --rcfile ~/TestAutomation/End2EndAutomation/bin/activate') 
os.system('End2EndAutomation/bin/jsnapy') 

[email protected]:~/TestAutomation$ python venv.py 
(End2EndAutomation) [email protected]:~/TestAutomation$ ^C 

我々が知る必要がありますか?

[EDIT1]

私はコメントに記載されたコードを使用しました。そのちょうどvirutal envに入る。 exitを発行すると、実行中のjsnapyコマンドが実行されます。

[email protected]:~/TestAutomation$ python venv.py 
(End2EndAutomation) [email protected]:~/TestAutomation$ exit 
exit 
usage: 
This tool enables you to capture and audit runtime environment of 
networked devices running the Junos operating system (Junos OS) 

Tool to capture snapshots and compare them 
It supports four subcommands: 
--snap, --check, --snapcheck, --diff 
1. Take snapshot: 
     jsnapy --snap pre_snapfile -f main_configfil 

答えて

0

os.system()を呼び出すたびに、新しいbashのインスタンスを作成し、前のものを終了します。あなたは、単一のbashスクリプト内のすべてのコマンドを入れて、呼び出すことができます1つのbashのインスタンスですべてのコマンドを実行するには、そのPythonの

source ~/TestAutomation/End2EndAutomation/bin/activate 
End2EndAutomation/bin/jsnapy 
deactivate 

run.sh

os.system()から

os.system('source run.sh') 

あるいは、複数のbashコマンドを書くこともできますが、すべてが1つのos.system()コールである限りです。

+0

仮想環境からの終了を発行するまでjnapyを呼び出さない。むしろ、システムコールを行うより効率的なやり方がありますか? – srinath

+0

あなたの質問にそのような問題の詳細を追加する必要があります。 – Soviut

0

os.system()を2回連続して呼び出すと、2つの独立したプロセスが順次作成されます。最初の処理が終了すると2番目の処理が実行されます。最初のプロセスで実行されたコマンドの影響は、2回目の実行時に忘れ去られ、フラッシュされます。

virtualenvで実行する必要があるアクティベーションとコマンドを、同じプロセス、つまり同じ単一シェルインスタンスで実行したいとします。

これを実行するには、bash -c '...'を使用して一連のコマンドを実行します。下記参照。

しかし、より良い解決策は、単にPython自体から仮想環境を有効にすることです。

p = os.path.expanduser('~/TestAutomation/End2EndAutomation/bin/activate_this.py') 
execfile(p, dict(__file__=p)) 
subprocess.check_call(['./End2EndAutomation/bin/jsnapy']) 

完全性のために、ここではBashソリューションをご紹介します。

import subprocess 
subprocess.check_call(['bash', '-c', """ 
    . ~/TestAutomation/End2EndAutomation/bin/activate 
    ./End2EndAutomation/bin/jsnapy"""]) 

subprocessos.system上の優先さえos.system documentationで推奨されています。

deactivateを明示的に指定する必要はありません。 bashコマンドが終了すると、暗黙的に仮想環境も非アクティブになります。

--rcfileトリックはいいアイデアですが、呼び出すシェルがインタラクティブでない場合は機能しません。

関連する問題