2011-12-05 112 views
0

我最近問了如何讓python shell獲得子進程輸出。並得到了一個非常有用的迴應 - ie.e.餵養POPEN一個標準輸出= subprocess.PIPE多線程需要多個管道

然後使用p.stdout.readline()和將結果打印()

 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() 

不過,我擔心當我發生了什麼事同時從多個線程調用此POpen。

相同的subprocess.PIPE正在fead到每個POpen。直到每條readline從兩個子進程獲得結果。

除了越來越有點奇特效果,每次循環(對於行吧:)

似乎要等到這兩個線程子進程都在繼續

之前完成,這不是我想要的。

  • 那麼有沒有一種方法可以讓我的一個管道(每個線程一個)PIPE,以便我可以依賴於每個線程完全獨​​立?

在此先感謝

回答

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()