Python从管道进程和Popen子进程同时读取stdin

时间:2018-01-11 15:34:51

标签: python multithreading io stream

我有一个非常具体的问题,我试图同时读取两个流,一个是从管道进程到stdin,另一个是从Popen开始的子进程。调用程序'stream_compare.py'

启动两个线程:线程1进入并开始从stdin读取:

while True:
      line = sys.stdin.readline().rstrip('\n')
      # do something

线程2以下列方式读取:

cmd = ["./run.sh", "test.txt"]
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, universal_newlines=True)
while proc.poll() is None:
      for line in proc.stdout.readlines():
               # do something

不幸的是,在启动程序时,来自传递给线程1中的stdin的管道进程的行似乎阻止了subprocess.Popen读取任何内容。单独地,当我没有将任何东西输送到'stream_compare'时,我可以让线程2正确运行,否则它什么都不做。

有没有办法在同一个程序中同时读取这样的两个流?假设一个流必须来自远程启动的管道进程(来自不同的服务器),并且必须通过Popen在与'stream_compare'相同的目录中将一个流作为子进程启动。一切都在linux机器上运行。

1 个答案:

答案 0 :(得分:0)

此代码:

for line in proc.stdout.readlines():
在开始迭代行之前,

正在等待stdout关闭/处理完成,因为readlines()会创建list行。你必须像这样循环线生成器:

for line in proc.stdout:

(一般来说,在逐行处理时,很少有充分理由使用readlines(),即使使用“有限”文件,因为它只使用更多内存。