Python stdout/stderr元组或字符串输出

Python stdout/stderr元组或字符串输出,python,tuples,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行返回一个字符串

我有一些代码,这是标准的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行成功地工作,没有错误,我可以在“package”上拆分和rstrip()

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

stdout = p.communicate() 
我得到一个错误:

    package = stdout[8:].rstrip()
AttributeError: 'tuple' object has no attribute 'rstrip'
有人能解释为什么会发生这种情况吗?因为stderr甚至没有被定义为第2行Popen上的管道,所以为什么它返回一个没有stderr的元组,而是一个字符串

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

这个简单的例子可以帮助您了解发生了什么:

>>> a, b = (1,2)
>>> a
1
>>> b
2
如果删除了
b
,则:

>>> a = (1,2)
>>> a
(1, 2)
a
被分配了整个元组的值,这不是您想要的。

返回一个元组

因此,您可以动态地将其解压缩(如在第一个版本中):

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

如果要删除stderr,可以编写:

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