【问题标题】:Why python's subprocess returns unexpected value? [duplicate]为什么python的子进程返回意外的值? [复制]
【发布时间】:2019-01-30 13:32:34
【问题描述】:

我为示例编写了以下程序--

from subprocess import *
import shlex


def pipe(command):
    proc = Popen(shlex.split(command), stdout=PIPE, stderr=PIPE)
    out, err = proc.communicate()
    print "output:", out       # blank
    print "errors:", err       # expected output
    #return str(err)           # returns expected output
    return str(out)            # returns blanked output


out = pipe('python --version')
print 'pipe returned ----- %s' % out

其实err持有的是期望值,而不是out

  1. 这段代码有什么问题?
  2. subprocess 模块是否仅用于处理基本操作系统的命令?

【问题讨论】:

  • 您可以尝试其他命令吗?像 Windows 上的 dir 或基于 unix 的系统上的 ls?你可能只是运气不好,python 会在标准错误中打印版本信息
  • “基本操作系统的命令”是什么意思?您可以将任何进程作为子进程运行。
  • 是 Ubuntu 18.04 @tripleee

标签: python subprocess pipe


【解决方案1】:

主要错误是版本信息将显示在标准输出上的毫无根据的假设。这是标准差,但 Python - 和许多其他 Unix 工具 - 将此输出发送到标准错误。

不太重要的是,您可能应该使用subprocess.run() 而不是原始Popen();而不是import *

from subprocess import run, PIPE

out = run(['python', '--version'],
    stdout=PIPE, stderr=PIPE, universal_newlines=True,
    check=True).stderr

如果您喜欢shlex,您可以使用它将命令拆分为一个包含两个字符串的列表,尽管在这种情况下这似乎是多余的。

【讨论】:

  • 更多详情请参见stackoverflow.com/a/51950538/87418
  • 正如副本所揭示的,自 3.4 以来,较新版本的 Python 实际上会将版本信息打印到标准输出。
  • 不管是run还是Popen()发起的进程,我都需要选择stderr。实际上,它可以追溯到 --- Python - 和许多其他 Unix 工具 - 将此输出发送到标准错误。无论如何,感谢您在评论部分提供的出色回答。
猜你喜欢
  • 1970-01-01
  • 2017-10-10
  • 2015-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 2018-06-06
相关资源
最近更新 更多