Popen 挂起通信
Popen hangs on communicate
我正在编写一个程序来与两个程序通信:
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 应该使用此行作为参数,return 结果并终止。这适用于 python2.4。但是,在 python2.6.6 上,似乎 snap 会在读取结果时挂起。
如果我将 query_cmd 更改为 "tail -f file"。它似乎也有效。
我 运行 在一个 csh 脚本中,其中两个 stdout/stderr 都被重定向到一个日志文件。
编辑:实际上,这很奇怪,在 csh 中,我将 stdout 和 stderr 都重定向到日志文件。如果我只重定向标准输出,运行 没问题。如果我重定向 stderr,它会挂起。我认为 stderr 在 python 的父进程和子进程之间以某种方式搞砸了。
似乎不是脚本的问题,而是因为子进程需要标准输入。将标准输入重定向到空设备解决这个问题。
我正在编写一个程序来与两个程序通信:
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 应该使用此行作为参数,return 结果并终止。这适用于 python2.4。但是,在 python2.6.6 上,似乎 snap 会在读取结果时挂起。 如果我将 query_cmd 更改为 "tail -f file"。它似乎也有效。
我 运行 在一个 csh 脚本中,其中两个 stdout/stderr 都被重定向到一个日志文件。
编辑:实际上,这很奇怪,在 csh 中,我将 stdout 和 stderr 都重定向到日志文件。如果我只重定向标准输出,运行 没问题。如果我重定向 stderr,它会挂起。我认为 stderr 在 python 的父进程和子进程之间以某种方式搞砸了。
似乎不是脚本的问题,而是因为子进程需要标准输入。将标准输入重定向到空设备解决这个问题。