【问题标题】:Python: Obtain output using subprocess.call, not Popen [duplicate]Python:使用 subprocess.call 获取输出,而不是 Popen [重复]
【发布时间】: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 ...

任何帮助将不胜感激。

【问题讨论】:

    标签: python subprocess


    【解决方案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,你说得对,我的疏忽。
    猜你喜欢
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    相关资源
    最近更新 更多