【发布时间】:2016-12-12 13:48:58
【问题描述】:
需求:
- X 秒后超时,如果在进程正常结束之前达到超时,则终止进程(以及它打开的所有进程)。
- 在运行时读取正在进行的输出。
- 使用产生输出的过程、不产生输出的过程以及产生输出的过程,然后停止产生输出(例如,获取 卡住了)。
- 在 Windows 上运行。
- 在 Python 3.5.2 上运行。
Python 3 子进程模块内置了timeout,我自己也尝试使用计时器和线程实现超时,但它不适用于输出。 readline() 是否阻塞? readlines() 在吐出所有输出之前肯定是在等待进程结束,这不是我需要的(我需要持续)。
我即将切换到 node.js :-(
【问题讨论】:
-
stdout 的问题可能出在子进程中。如果未刷新标准输出缓冲区,则 python 将永远不会接收内容(无论您使用什么语言,这都是相同的)。一种可能的解决方案(未经测试)是在
subprocess.Popen中将孩子的标准输出分配给标准错误。通常 stderr 是无缓冲的。 -
是的,
readline将阻塞,等待接收下一行,其他任何读取sys.stdin的内容也是如此。您可以通过在命令行上指定-u选项来告诉 Python 使sys.stdout无缓冲。 -
没有人关心你是否切换到 node.js...
标签: python python-3.x timeout subprocess stdout