stdout / stderr元组或字符串输出

时间:2015-09-04 08:28:57

标签: python tuples

我有一些代码,它是stdout的标准命令。

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行然后成功运行而没有错误,我可以在'包'上拆分和rstrip()。

 stdout, stderr = p.communicate()

然而......如果我删除' stderr'从第3行开始,所以它最终成为

stdout = p.communicate() 

我收到错误:

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

有人可以解释为什么会发生这种情况,因为stderr甚至没有被定义为第2行Popen上的管道,那么为什么它返回没有stderr的元组,而是带有它的字符串?

我已经解决了这个问题,虽然它花了我30分钟,现在想知道为什么重要。 感谢。

2 个答案:

答案 0 :(得分:3)

communicate返回一个元组

所以你可以在运行中解压缩它(就像你的第一个版本一样):

stdout, stderr = p.communicate()

或者您可以按原样获取元组(就像修改后的代码一样):

stdout = p.communicate() # tuple with 'stdout' and 'stderr'

我想放弃stderr,你可以写:

stdout = p.communicate()[0]

答案 1 :(得分:1)

这个更简单的例子可以帮助您了解正在发生的事情:

>>> a, b = (1,2)
>>> a
1
>>> b
2

如果删除b,则:

>>> a = (1,2)
>>> a
(1, 2)

a被赋予整个元组的值,这不是你想要的。