subprocess.popen的poll方法为long进程返回None

时间:2012-08-13 15:03:13

标签: python subprocess popen

我正在通过子进程执行curl命令。此curl命令在另一台服务器上启动视频处理,并等待响应。完成此过程后,远程服务器将返回json对象。我正在使用poll()值检查子进程的状态,该值为None - 进程未完成,0进程成功完成,1-表示错误。

如果处理在远程服务器上花费大约30分钟或更少,我得到正确的响应,但如果处理花费更多时间,我只得到无值,即使我可以看到远程服务器已经完成处理并已经返回了json对象。

任何人都可以告诉我,poll()可能的原因可能是在一定时间后仅返回None。提前谢谢。

我的Popen对象是:

object = subprocess.Popen(str(curlCmd), shell=True,
                           stdout=subprocess.PIPE,
                           stderr=subprocess.PIPE)

我每隔2秒就调用object.poll()来检查过程是否成功完成。

5 个答案:

答案 0 :(得分:4)

在Popen.poll中,您似乎可以尝试使用此链接中列出的解决方案。 http://www.gossamer-threads.com/lists/python/bugs/633489

答案 1 :(得分:2)

.poll() is None表示孩子仍在跑步。

curl进程可能会在它填满stdout或stderr OS管道缓冲区(我的Linux机箱大约64K)后立即挂起,除非你从管道末端读取。

当你等待孩子完成时,孩子会等你排空管道缓冲区 - 死锁。来自the subprocess docs

  

使用.wait()stdout=PIPE时,此[stderr=PIPE]会陷入僵局   进程为管道生成足够的输出,以阻止等待   为OS管道缓冲区接受更多数据。使用Popen.communicate()   当使用管道来避免这种情况时。

您可以使用线程async.io同时使用管道。

答案 2 :(得分:0)

最后我最终使用PyCurl而不是创建子进程并通过它调用curl命令。它似乎是一个提出的问题位子进程,其中.poll方法在一定时间后没有返回,原因仍然不清楚。如果您正在运行长进程,我想通知正在使用subprocess - poll方法(没有等待/通信)的人知道它。谢谢J.F. Sebastian和Pranav的指示。

答案 3 :(得分:0)

在python 2.7中,可能3.x可以使用:

object._internal_poll(_deadstate=127)

而非常规Popen.poll()作为解决方法。如果进程终止,这将返回127而不是None。

当然这是一个内部模块的方法,并且无法保证它在Python库更新后能够正常工作。

答案 4 :(得分:0)

To complement hegemon, this code works on 2.7:

process = subprocess.Popen(cmd, cwd=current_dir, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE )
process._internal_poll(_deadstate='dead')

while timeout > 0:
  if process.poll() is not 'dead':