【发布时间】:2015-08-18 06:38:47
【问题描述】:
我正在编写一个程序来与两个程序通信:
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 上,似乎 snap 会在读取结果时挂起。 如果我将 query_cmd 更改为“tail -f 文件”。它似乎也有效。
我在一个 csh 脚本中运行它,其中 stdout/stderr 都被重定向到一个日志文件。
编辑:实际上,这很奇怪,在 csh 中,我将 stdout 和 stderr 都重定向到了日志文件。如果我只重定向标准输出,它运行良好。如果我重定向stderr,它会挂起。我认为不知何故stderr在python的父进程和子进程之间搞砸了。
【问题讨论】:
-
如果您注释掉
snap_result =和后面的行,而只是打印行,会发生什么? -
如果我将其注释掉,它将起作用,它只会打印出该行
-
如果删除 close_fds 会发生什么?如果你用例如替换“snap”会发生什么? “回声”?
-
close_fds 似乎是必要的。它应该防止python子进程共享文件句柄。
-
您是否尝试不使用 close_fds?