2011-12-05 14 views
0

最近、Pythonシェルにサブプロセス出力を得る方法を尋ねました。非常に有用な反応を得ました。 popenのを供給STDOUT = subprocess.PIPE複数のスレッドが複数のパイプを必要とする

が、その後

 p = subprocess.Popen(args, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE, cwd=StartPath, shell=False) 
     it = iter(p.stdout.readline, b'') 
     sRet = "## decode Error ##" 
     for line in it: 
      try: 
       sRet = line.rstrip().decode('utf-8') 
      except: 
       pass 

      print(sRet[:PYTHON_WINDOW_WIDTH]) 

     viRet = p.wait() 

しかし、私は私が時に何が起こっているのか心配です)(p.stdout.readlineを(使用)して印刷するために、結果を養いますこのPOpenを複数のスレッドから同時に呼び出す

同じサブプロセスです.PIPEは各POpenに対応しています。それぞれのreadlineが両方のサブプロセスの結果を取得するまで拡張します。

やや風変わりな結果を得る以外にも、その中の行の各ループ(:)

は、両方のスレッドがサブプロセスは、これは私が欲しいものではありません

に移動する前に終了するまで待つようです。

  • 私はそれぞれのスレッドが完全に独立していることができるように、私は自分のパイプ(スレッドごとに1つ)を持つことができる方法はありますか?

私は私の答えを見つけたように見え事前

答えて

0

に感謝 - (os.pipeを使用して)

結果は次のようなものになります。

 r,w = os.pipe() 

     my_stdout=os.fdopen(r) 
     os.close(w) 

     p = subprocess.Popen(args, stdout=my_stdout, stdin=subprocess.PIPE, stderr=my_stdout, cwd=StartPath, shell=False) 
     it = iter(p.stdout.readline, b'') 
     sRet = "## decode Error ##" 
     for line in it: 
      try: 
       sRet = line.rstrip().decode('utf-8') 
      except: 
       pass 

      with MyGlobals.PrintLock: 
       print(sRet[:PYTHON_WINDOW_WIDTH]) 

     viRet = p.wait() 
関連する問題