当尝试进行subprocess.Popen调用以获取命令的返回代码时,根据是否将调用分解为不同的语句,我会得到不同的结果。我不再束手无策了,只能将它作为单个语句工作,但是我无法阐明为什么会这样,并且想了解更多(如果有可能获得单个语句,那么显然会更好)。 / p>
我想做的是以下事情:
my_variable = subprocess.Popen(
'ip addr show ens192 | grep master',
shell=True).communicate().returncode
哪种产量:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'returncode'
但是,当我采用相同的逻辑并将其分成几行时,它会起作用:
>>> my_variable = subprocess.Popen('ip addr show ens192 | grep master', shell=True)
>>> my_variable.communicate()
(None, None)
>>> my_variable.returncode
1
>>>
这是为什么?这不是我过去使用Python的行为,我猜测它与它在后台运行命令的方式有关。
答案 0 :(得分:6)
returncode
是Popen
的属性,而不是communicate()
返回的元组的属性。
因此my_variable.returncode
起作用,因为my_variable
是Popen
实例。
另一方面,subprocess.Popen(...).communicate().returncode
不起作用,因为虽然subprocess.Popen(...)
是Popen
实例,但是subprocess.Popen(...).communicate()
的计算结果是由以下内容返回的元组(None, None)
communicate
,而不是调用它的Popen
实例。
错误消息告诉您,元组没有属性returncode
。
您的问题仅仅是communicate()
返回值的混乱。它不会返回调用它的Popen
实例。这不是Popen
的内部工作原理或语义问题。