我会建议采取看看Timer
类中threading
的模块。我用它来实现超时Popen
。
首先,创建一个回调:
def timeout( p ):
if p.poll() is None:
print 'Error: process taking too long to complete--terminating'
p.kill()
然后打开过程:
proc = Popen( ... )
然后创建一个计时器,该计时器将调用回调,并将过程传递给它。
t = threading.Timer( 10.0, timeout, [proc] )
t.start()
t.join()
在程序后面的某个位置,您可能需要添加以下行:
t.cancel()
否则,python程序将继续运行,直到计时器运行完毕。
编辑:我被告知,subprocess
p
在p.poll()
和条件之间可能存在可能终止的竞争条件p.kill()
。我相信以下代码可以解决此问题:
import errno
def timeout( p ):
if p.poll() is None:
try:
p.kill()
print 'Error: process taking too long to complete--terminating'
except OSError as e:
if e.errno != errno.ESRCH:
raise
尽管您可能希望清除异常处理以专门处理子过程已经正常终止时发生的特定异常。
问题内容: 我正在python中使用subprocess模块运行一些shell脚本。如果shell脚本运行时间很长,我想杀死该子进程。我认为如果将其传递给我的陈述就足够了。 这是代码: 我已经用一些运行120秒的shell脚本测试了此调用。我期望子进程在30秒后被杀死,但是实际上该进程正在完成120秒脚本,然后引发了Timeout Exception。现在的问题是如何通过超时杀死子进程? 问题
问题内容: 我想在子流程上使用超时 不幸的是,尽管这会引起超时错误,但它会在30秒后发生。看来check_output无法中断shell命令。 我该如何在Python方面阻止这种情况?我怀疑subprocess32无法杀死超时的进程。 问题答案: 超时基本上是: 有两个问题: [第二个]可能会等待后代进程,而不仅是直接子进程,请参见Python子进程.check_call与.check_outpu
问题内容: 有没有办法在python中“持久”进行子过程调用?我正在调用一个程序,该程序需要一段时间才能加载多次。因此,如果我不关闭程序就可以保持打开状态并与之通信,那将是很好的。 我的python脚本的卡通版本如下所示: 我需要分别处理每个文本,因此将它们全部合并到一个大文本文件中并进行一次处理不是一种选择。 最好,如果有这样的选择 我可以让流程保持开放状态,对此我将非常感激。 问题答案: 您可
问题内容: 我想尽可能快地重复执行子过程。但是,有时该过程将花费很长时间,因此我想取消它。我使用signal.signal(…),如下所示: 但有时这段代码将尝试阻止下一轮执行。停止test / home / lu / workspace / 152 / treefit / test2超时/ bin / sh:/ home / lu / workspace / 153 / squib_driver
问题内容: 我尝试完成的任务是流式处理ruby文件并打印输出。(注意:我不想一次打印出所有内容) main.py puts “hello” 问题 流文件工作正常。打招呼/再见输出将延迟2秒打印。就像脚本应该工作一样。问题是readline()最终挂起并且永不退出。我从来没有达到最后的打印。 我知道这里有很多类似的问题,但是这些都不是让我解决问题的方法。我并不是整个子流程中的人,所以请给我一个更实际
问题内容: 我想同时运行许多进程并能够随时输出stdout。我该怎么办?我需要为每个调用运行线程吗? 问题答案: 您可以在一个线程中完成。 假设您有一个脚本可以随机打印行: 而且您想在输出可用后立即收集它,您可以按照@zigg的建议在POSIX系统上 使用: 更具可移植性的解决方案(应在Windows,Linux,OSX上运行)可以为每个进程使用读取器线程,请参阅python中的对子进程的非阻塞读