为什么subprocess.popen的行为与单个语句不同?

时间:2019-09-04 19:36:23

标签: python python-2.7

当尝试进行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的行为,我猜测它与它在后台运行命令的方式有关。

1 个答案:

答案 0 :(得分:6)

returncodePopen的属性,而不是communicate()返回的元组的属性。

因此my_variable.returncode起作用,因为my_variablePopen实例。

另一方面,subprocess.Popen(...).communicate().returncode不起作用,因为虽然subprocess.Popen(...)Popen实例,但是subprocess.Popen(...).communicate()的计算结果是由以下内容返回的元组(None, None) communicate,而不是调用它的Popen实例。 错误消息告诉您,元组没有属性returncode

您的问题仅仅是communicate()返回值的混乱。它不会返回调用它的Popen实例。这不是Popen的内部工作原理或语义问题。