【问题标题】:Is there a Python subprocess-like call that takes a stdin input string and returns stderr, stdout, and return code?是否有一个类似于 Python 子进程的调用,它接受一个标准输入字符串并返回标准错误、标准输出和返回码?
【发布时间】:2014-02-20 18:09:20
【问题描述】:

根据主题行,是否有一个标准的 Python 2.7 库调用,我可以像这样使用:

(returncode, stdout, stderr) = invoke_subprocess(args, stdin)

关键是我想要所有三种形式的输出:返回码和来自 stdout 和 stderr 的整个(和单独的)内容。我希望在 subprocess 模块中找到类似的东西,但我能看到的最接近的是subprocess.check_output,它给出了三分之二(返回码和标准输出)。

还有其他关于堆栈溢出的问题建议将 stderr 传递到 stdout,但我需要将它们分开,因为我正在使用 Python 来驱动一些非 Python 应用程序的测试,在这些应用程序中我试图区分显示的输出在哪些流上。例如,我想验证人类可读的错误消息是否显示在标准错误中,但只有机器可解析的输出数据显示在标准输出中。

我想我想要的是一个简单的四线......

def method(args, input):
    from subprocess import Popen, PIPE
    p = Popen(args, stdin=PIPE, stdout=PIPE, stderr=PIPE)
    out, err = p.communicate(input)
    return (p.poll(), out, err)

...鉴于subprocess 模块中大部分与此类似的其他方法的数量,我对目前还没有这样的方法感到有点惊讶。它是否存在并且我错过了它,或者它是否存在于其他一些标准 Python 2.7 模块中?或者有什么微妙的原因说明这样的方法是个坏主意?

【问题讨论】:

  • “我想我想要的是一个简单的四线......所以我有点惊讶,现在还没有这样的方法......” - 正如你所说,这是一个简单的 4 线。一般来说,如果我必须编写 4 行代码来做某事,我并不感到惊讶...... :) 虽然,FWIW,我会使用 p.returncode 而不是 p.poll(),因为 returncode 也是由 @987654328 设置的@.
  • 在 Python 3.5 及更高版本中,使用subprocess.run()

标签: python python-2.7 subprocess


【解决方案1】:

它不存在,因为这就是 subprocess.Popen 的设计目的。其他功能主要用于支持直接替换os.system 和常见的简单自动化案例。试图用单行代码覆盖每个用例会导致函数集更加臃肿。

另请注意,您可以使用p.returncode 而不是p.poll()。保证在p.communicate(...) 返回时已设置。

【讨论】:

  • 接受这个作为最接近的答案,尽管在我看来,这样的功能与代码膨胀相反:子进程中较长的方法可以被删除和/或更简洁地表达为像这样的方法。 (例如,def call(*args, **kwargs): return method(*args, **kwargs)[0]。)
【解决方案2】:

您可以使用 os.system(cmd) 返回命令的返回码。

【讨论】:

  • 由于os.system() 文档明确指出,使用subprocess 模块中的方法更可取并且 因为该问题专门要求返回stderr 和stdout 的东西(两者都不其中由os.system()返回),这不是一个合适的答案。
  • 是的,你可以更喜欢 subprocess 而不是 os.system() 但是如果命令很小并且只需要获取错误返回码然后使用 os.system()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-11
  • 2012-08-05
  • 1970-01-01
  • 2017-01-19
  • 2020-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多