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

Python:使用subprocess.call而不是Popen获取输出,python,subprocess,Python,Subprocess,我有一个Python脚本的系统调用。我想有一个计时器,以及利用调用的输出。我可以一次执行一个:使用subprocess.call()实现一个计时器,并使用subprocess.Popen()检索输出。但是,我需要定时器和输出结果 有没有办法做到这一点 下面的代码给了我一个属性错误:“int”对象没有属性“stdout”,因为子流程.call输出不是我需要使用的Popen对象 ... Open file here ... try: result = subprocess.call(cmd

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

有没有办法做到这一点

下面的代码给了我一个
属性错误:“int”对象没有属性“stdout”
,因为
子流程.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 ...

任何帮助都将不胜感激。

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

注:

不要将stdout=PIPE或stderr=PIPE用于此函数。由于当前进程中没有读取管道,如果子进程生成足够的输出到管道以填充OS管道缓冲区,则子进程可能会阻塞

接下来是文档中的第一行

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

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

有关退出代码的更多信息

由于您需要计时器的“输出”,因此可能需要恢复到

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

…或类似的东西。

除非需要,否则不要使用
shell=True
。OP也可以使用
子流程。检查输出()
@J.F.Sebastian,你说得对,我的疏忽。