2011-12-05 71 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()