【问题标题】:read python STDOUT realtime实时读取python STDOUT
【发布时间】:2015-02-14 23:23:48
【问题描述】:

我的代码如下,基本上这个模块将运行所需的命令并逐行捕获其输出,但在我的情况下,当命令运行时,返回命令提示符只需要一秒钟多的时间,这就是 child .stdout.read(1) 挂起,如果我使用它运行正常命令,它会按预期打印所有内容。但在特定情况下,该命令将某些内容打印到 STDOUT,然后需要一些时间才能返回到提示符,它会挂起.. 请帮助

新代码:

def run_command(shell_command):
'''run the required command and print the log'''
child = subprocess.Popen(shell_command, shell=True,stdout=subprocess.PIPE)
(stdoutdata, stderrdata) = child.communicate()
print stdoutdata

print "Exiting.."

错误:

  File "upgrade_cloud.py", line 62, in <module>
stop_cloud()
File "upgrade_cloud.py", line 49, in stop_cloud
run_command(shell_command)
 File "upgrade_cloud.py", line 33, in run_command
 (stdoutdata, stderrdata) = child.communicate()
 File "/usr/lib/python2.6/subprocess.py", line 693, in communicate
stdout = self.stdout.read()
KeyboardInterrupt

【问题讨论】:

  • 嗯...我怀疑这可能是issue 7213。您是否有多个 Popen 实例同时运行?
  • 不,一次它只运行一个命令就出来了。
  • 请帮忙,我被困在这个问题上
  • 我唯一能想到的另一件事是实际的命令本身是挂起的。如果是这样的话,Python 就无能为力了。
  • 不,不是这样,我可以手动运行命令

标签: python subprocess stdout


【解决方案1】:

这是你的问题:

child.wait()

这一行导致 Python 等待子进程退出。如果子进程试图将大量数据打印到标准输出,它将阻塞等待 Python 读取所述数据。由于 Python 正在等待子进程,而子进程正在等待 Python,所以会出现死锁。

我建议使用subprocess.check_output() 而不是subprocess.Popen。您也可以使用Popen.communicate() 方法代替.wait() 方法。

【讨论】:

  • Python 2.6.5 (r265:79063, Feb 27 2014, 19:43:51) [GCC 4.4.3] on linux2 键入“help”、“copyright”、“credits”或“license” “ 了解更多信息。版本是 2.6,它没有 check_output,问题是我无法将环境升级到最新的 python
  • 它仍然挂起,文件“upgrade_cloud.py”,第 14 行,在 run_command child.communicate() 文件“/usr/lib/python2.6/subprocess.py”,第 693 行,在通信中stdout = self.stdout.read() KeyboardInterrupt .. 我不得不使用键盘中断
  • 一旦你完成了communicate()child.stdout 就是一个无用的对象。您需要保存 communicate() 的返回值并使用它。
  • child = subprocess.Popen(shell_command, shell=True,stdout=subprocess.PIPE) (stdoutdata, stderrdata) = child.communicate() print stdoutdata 所以理想情况下这应该打印标准输出的所有行,对吧?但它不能这样做
  • 沟通绝对是必经之路。一次读取一个字符效率非常低。
猜你喜欢
  • 2018-03-17
  • 1970-01-01
  • 2011-11-12
  • 1970-01-01
  • 2013-01-15
  • 1970-01-01
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多