2016-06-19 1 views
2

サブプロセスを開始し、完了するまで待ってから必要なデータを取得するために、いくつかのpythonスクリプトを取得するのが苦労しています。私はPythonの新機能です。サブプロセスを開始し、完了するのを待ち、Pythonでデータを取得します。

in terminal mode 
    Evaluation error = 16.7934 

は、私はPythonのサブとしてコマンドを実行したい:

私はサブプロセスとして実行したいコマンドは、Linux端末に手でそのコマンドを実行する

./bin.testing/Eva -t --suite="temp0" 

が生成されます処理し、出力を受け取る。

def job(self,fen_file): 
     from subprocess import Popen, PIPE 
     from sys import exit 

     try: 
      eva=Popen('{0}/Eva -t --suite"{0}"'.format(self.exedir,fen_file),shell=True,stdout=PIPE,stderr=PIPE)    
      stdout,stderr=eva.communicate() 
     except: 
      print ('Error running test suite '+fen_file) 
      exit("Stopping") 

     print(stdout) 
     . 
     . 
     . 
     return 0 

このすべてが生産するようだが

in terminal mode 

    0 
次のとおりです。しかし、私がしようすべては現時点で(。最終的に、それは私が欲しい二行目だ)二行目を飛ばしているようだ、私はこれを持っています

に重要な行がありません。 print文はちょうど私がサブプロセスから戻ってくるものを見ることができるので、2行目の数値を処理して出力を返すコードに置き換えられます0この関数の呼び出し側は結果を出力します。なぜなら、出力の最後にゼロがあるからです。)exedirはサブプロセス用の実行可能ファイルのディレクトリです、fen-fileは、サブプロセスに必要なasciiファイルです。私は、サブプロセスのソースコードから '端末モードで'を削除して再コンパイルしようとしましたが、それは動作しません - それでも重要な第2行は返されません。

ありがとうございます。私が間違ってやっていることが本当にとても簡単だと思います。

編集:サブプロセスのEvaが完了するまでに2〜2時間かかります。

答えて

2

2行目がエラーメッセージであるため、おそらくstderr変数に保存されています。

コードにstderrを印刷するか、コマンドラインでプログラムを実行して、出力がstdoutstderrに分割されているかどうかを確認することができます。 1つの簡単な方法は./bin.testing/Eva -t --suite="temp0" > /dev/nullです。 stdout/dev/nullにリダイレクトされているため、取得するメッセージはstderrです。

また、通常Popenの場合は、実際に必要な場合を除き、shell=Trueのオプションはお勧めできません。代わりに、リストを渡してください:

[os.path.join(self.exedir, 'Eva'), '-t', '--suite=' + fen_file], shell=False, ... 

これは、通常、あなたの引数の1つがシェルによって解釈される場合、問題を回避することができます。 (シェルは通常それらを食べるので、""を削除しました!)

+0

output_lines = subprocess.check_output(['./bin.testing/Eva', '-t', '--suite="temp0"']) for line in output_lines.splitlines(): print(line) 
こんにちは、誤解を招くが、それはエラーメッセージではない:それは計算量と測定したものとの間の二乗差を計算されたサブプロセスの所望の出力です。しかし、リストを渡してshell = trueを削除し、二重引用符を削除することで、それが機能しています。ありがとう! – ppyvabw

+0

@ppyvabwあなたが知っているのは、 '' - '' 0 '''だったかもしれない - あなたが '='を忘れていたとは言いませんでしたが、 – rrauenza

0

サブプロセスcheck_outputを使ってみてください。おそらく「評価エラー」

関連する問題