我知道有关终止子进程调用的问题已被问过几次,包括here,但是,试图按照这些答案,如果脚本挂起(我的话,我似乎无法退出)我正在执行一个phantomjs脚本)。例如,如果我尝试在我的幻像代码中加载一个不存在的jquery文件,那么即使我有一个超时,脚本也会挂起。这是我的代码:
def kill_proc():
if p.poll() != 0:
process.kill()
p = subprocess.Popen(['phantomjs','file.js'],stdout=subprocess.PIPE)
out, phantomError = p.communicate()
t = Timer(5, kill_proc) # should kill it after 5 seconds
t.start()
p.wait()
我的phantomjs脚本(正在进行的工作):
var page = require('webpage').create();
page.includeJs("http://localhost/jquery.js",function(){
phantom.exit();
});
答案 0 :(得分:1)
我认为您的问题可能是p.communicate()将“Wait for process to terminate”,这意味着如果脚本挂起,您的计时器实际上永远不会启动。
在计时器启动后移动你的通话进行通信(并在kill_proc函数中将process.kill()更改为p.kill()),我认为它会做你想要的。
正如我上面提到的那样,Python 3.3的子进程模块函数有一个超时参数,可以自动完成。