Python Popen挂在通讯上

Python Popen挂在通讯上,python,popen,Python,Popen,我正在编写一个与两个程序通信的程序: output = Popen(shlex.split(query_cmd), stdout=PIPE,stdin=None) cmd_out = [output.stdout] while cmd_out: readable,writeready,exceptready = select.select(cmd_out,[],[],timeout) for f in readable: line = f.readline() snap_resu

我正在编写一个与两个程序通信的程序:

output = Popen(shlex.split(query_cmd), stdout=PIPE,stdin=None)
cmd_out = [output.stdout]
while cmd_out:
readable,writeready,exceptready = select.select(cmd_out,[],[],timeout)
for f in readable:
    line = f.readline()
    snap_result=Popen(shlex.split("snap %s" % (line) ),stdout=PIPE,close_fds=True).communicate()[0]
    print snap_result
据推测,query_cmd将连续生成结果行。snap应该使用此行作为参数,返回结果并终止。这适用于python2.4。然而,在python2.6.6上,快照似乎将挂起在读取结果时。 如果我将查询更改为“tail-f file”。它似乎也起作用

我在一个csh脚本中运行它,其中两个stdout/stderr都被重定向到一个日志文件


编辑:实际上,这很奇怪,在csh中,我将stdout和stderr重定向到日志文件。如果我只重定向stdout,它运行良好。如果我重定向stderr,它将挂起。我认为在某种程度上,strr在python的父进程和子进程之间搞砸了

似乎不是脚本的问题,而是因为子进程需要stdin输入。将stdin重定向到空设备以解决此问题

似乎不是脚本的问题,而是因为子进程需要stdin输入。将stdin重定向到空设备以解决此问题

如果您注释掉
snap\u result=
和下一行,而只是打印出一行,会发生什么?如果我注释掉它,它会工作,它只打印出一行,如果您删除close\u fds会发生什么?如果将“snap”替换为例如“echo”,会发生什么情况?关闭fds似乎是必要的。它应该防止python子进程共享文件句柄。您是否尝试不使用close\u fds?如果您注释掉
snap\u result=
和下面的行,而只是打印出行,会发生什么情况?如果我注释掉它,它会工作,它只打印出行,如果删除close\u fds会发生什么?如果将“snap”替换为例如“echo”,会发生什么情况?关闭fds似乎是必要的。它应该防止python子进程共享文件句柄。您是否尝试不使用close\u fds?如果您注释掉
snap\u result=
和下面的行,而只是打印出行,会发生什么情况?如果我注释掉它,它会工作,它只打印出行,如果删除close\u fds会发生什么?如果将“snap”替换为例如“echo”,会发生什么情况?关闭fds似乎是必要的。它应该防止python子进程共享文件句柄。您是否尝试不使用close_fds?