我有一个非常具体的问题,我试图同时读取两个流,一个是从管道进程到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机器上运行。
答案 0 :(得分:0)
此代码:
for line in proc.stdout.readlines():
在开始迭代行之前,正在等待stdout
关闭/处理完成,因为readlines()
会创建list
行。你必须像这样循环线生成器:
for line in proc.stdout:
(一般来说,在逐行处理时,很少有充分理由使用readlines()
,即使使用“有限”文件,因为它只使用更多内存。