Python:使用subprocess.call获取输出,而不是Popen

时间:2015-02-07 01:00:07

标签: python subprocess

我有一个Python脚本系统调用。我想有一个计时器以及利用呼叫的输出。我一次只能做一个:使用subprocess.call()实现计时器并使用subprocess.Popen()检索输出。但是,我需要定时器和输出结果。

有没有办法实现这个目标?

以下代码为我提供Attribute error: 'int' object has no attribute 'stdout',因为subprocess.call输出不是我需要使用的Popen对象。

... Open file here ...

try:
    result = subprocess.call(cmd, stdout=subprocess.PIPE, timeout=30)
    out = result.stdout.read()
    print (out)
except subprocess.TimeoutExpired as e:
    print ("Timed out!")

... Write to file here ...

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

subprocess.call()的文档中,我注意到的第一件事就是:

  

注意:

     

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

接下来是文档中的第一行

  

运行args描述的命令。等待命令完成,然后返回returncode属性。

subprocess.call将返回“退出代码”,int,通常为0 =成功,1 =出错,等等。

有关退出代码的更多信息... http://www.tldp.org/LDP/abs/html/exitcodes.html

由于您需要来自计时器的“输出”,因此您可能希望恢复为

timer_out = subprocess.Popen(command, shell=True, stdout=PIPE, stderr=PIPE, universal_newlines=True)
stout, sterror = timer_out.communicate()

......或类似的东西。