当我设置stdout时,调用subprocess.call会挂起

时间:2012-03-20 10:39:13

标签: python subprocess

我有一个函数,我称之为progarm,有一些args并希望得到结果。

当我使用以下

proc = subprocess.call(["fetch.py", "--cookies=/tmp/tmp-cookies"], stdout=PIPE, stderr=PIPE)
stdout, stderr = proc.communicate()
return stdout

该应用只是挂起。 但如果我跑

return subprocess.call(["fetch.py", "--cookies=/tmp/tmp-cookies"])

然后我在屏幕上得到输出,应用程序运行正常,但我需要将输出转换为函数。

我使用的是python 2.6.1,无法使用check_output

2 个答案:

答案 0 :(得分:5)

正如spec所说,

  

不要将stdout = PIPE或stderr = PIPE与此功能一起使用。由于在当前进程中没有读取管道,子进程可能会阻塞它是否为管道生成足够的输出以填充OS管道缓冲区。

您需要的是subprocess.Popen

proc = subprocess.Popen(["fetch.py", "--cookies=/tmp/tmp-cookies"], 
                       stdout=PIPE, stderr=PIPE)
stdout, stderr = proc.communicate()
return stdout

(另外,subprocess.call不返回进程对象,只退出状态)

答案 1 :(得分:0)

您的子流程必须在通信完成之前读取其stdin,并且主流程可以继续。解决方法将在一个帖子中写出来。