标准输出(stdout)/标准错误输出(stderr)元组或字符串输出

4

我有一些代码,这是一个标准的将输出发送到标准输出的命令。

params = [toolsDir + "\\adb.exe", "shell", "pm", "path", app]
p = Popen(params, shell=False, stdout=subprocess.PIPE)
stdout, stderr = p.communicate()
    if "package:" in stdout:
         package = stdout[8:].rstrip()

第3行返回一个字符串,在第5行成功执行并且没有错误后,我可以在'package'上进行split和rstrip()操作。

 stdout, stderr = p.communicate()

然而...如果我从第3行中删除'stderr',那么它将变成
stdout = p.communicate() 

我遇到了错误:

    package = stdout[8:].rstrip()
AttributeError: 'tuple' object has no attribute 'rstrip'

有人能解释一下为什么会发生这种情况吗?在第2行Popen中,stderr甚至没有定义为管道,为什么它会返回一个没有stderr的元组,但是却返回带有stderr的字符串?

我已经解决了这个问题,尽管花了我好几十分钟的时间,现在想知道为什么它很重要。谢谢。

2个回答

3

communicate 返回一个元组

因此,您可以像第一个版本一样即时解包它:

stdout, stderr = p.communicate()

或者你可以按照原样获取元组(就像是你修改后的代码):
stdout = p.communicate() # tuple with 'stdout' and 'stderr'

如果你想要禁用 stderr,你可以这样写:
stdout = p.communicate()[0]

1
这个更简单的例子可以帮助您理解发生了什么:
>>> a, b = (1,2)
>>> a
1
>>> b
2

如果移除了b,那么:
>>> a = (1,2)
>>> a
(1, 2)

a被分配了整个元组的值,这不是你想要的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接