【问题标题】:Popen hangs on communicatePopen 挂起通信
【发布时间】: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?

标签: python popen


【解决方案1】:

似乎不是脚本的问题,而是因为子进程需要标准输入。将标准输入重定向到空设备解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 2015-11-19
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多