我有一些代码,它是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分钟,现在想知道为什么重要。 感谢。
答案 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
被赋予整个元组的值,这不是你想要的。