1

我知道终止子进程调用的问题已被问过几次,包括这里,但是,尝试遵循这些答案,如果脚本挂起,我似乎无法退出(在我的情况下,我正在执行 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();
});
4

1 回答 1

1

我认为您的问题可能是 p.communicate() 将“等待进程终止”,这意味着如果脚本挂起,您的计时器实际上永远不会启动。

在计时器启动后将您的通话移至进行通信(并在 kill_proc 函数中将 process.kill() 更改为 p.kill() ),我认为它会满足您的要求。

正如我在上面的评论中提到的,Python 3.3 的 subprocess 模块函数有一个 timeout 参数,可以让这一切自动发生。

于 2013-04-13T20:20:02.137 回答