为什么python的子进程返回意外值?

时间:2019-01-30 13:32:35

标签: python subprocess pipe

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

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. 子进程 模块仅用于处理基本操作系统的命令吗?

1 个答案:

答案 0 :(得分:2)

主要错误是没有根据的假设,即版本信息将显示在标准输出上。这是标准化程度不高的工具,但是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,可以使用该命令将命令分成两个字符串列表,尽管在这种情况下看起来似乎是多余的。