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

Posted

技术标签:

【中文标题】Python:使用 subprocess.call 获取输出,而不是 Popen [重复]【英文标题】:Python: Obtain output using subprocess.call, not Popen [duplicate] 【发布时间】:2015-04-07 06:39:05 【问题描述】:

我有一个从 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】:

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

注意:

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

接下来是文档的第一行

运行 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()

...或类似的东西。

【讨论】:

除非你需要,否则不要使用shell=True。 OP也可以使用subprocess.check_output() @J.F.Sebastian,你说得对,我的疏忽。

以上是关于Python:使用 subprocess.call 获取输出,而不是 Popen [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中使用 subprocess.call 播放音频

Python下的subprocess.call()使用和注意事项

如何在 python 中杀死使用 subprocess.call 调用的子进程? [复制]

Python, subprocess, call(), check_call 和 returncode 来查找命令是不是存在

在 Python 中使用 subprocess.call('dir', shell=True) 时找不到指定的文件

Python subprocess.call 在没有 shell=True 的 Windows 上失败