subprocess poll()返回错误的值

时间:2016-02-04 11:46:08

标签: python subprocess

我正在开始一个过程并将其存储在变量中:

 self.wpa_sup=subprocess.Popen(["/usr/sbin/wpa_supplicant", "-Dnl80211,wext", "-i",self.linux_iface, "-c", "/etc/wpa_supplicant_%s.conf"%self.name, "-s"], 
                stdout=open('/dev/null','w'),  stderr=subprocess.STDOUT)

如果我打印变量,我可以看到该值已存储。 我可以看到wpa_supplicant确实已经开始了。

但是当我检查poll()值时,我会255而不是None

print self.wpa_sup.poll()

当我停止这个过程时,我会这样做:

self.wpa_sup.terminate()
self.wpa_sup.wait()
self.wpa_sup=None

有时(很多时候)它有效,我可以停止并开始这个过程,成功地从poll()读取值,但它看起来不可靠。知道为什么会这样吗?

1 个答案:

答案 0 :(得分:2)

  

我可以看到wpa_supplicant确实已经开始了。

如果.poll()返回非None值;这意味着该进程而且它已经收集(状态被读取),即您不会在进程表中看到任何内容。如果你看到.poll() == 255之后的某些内容;这意味着您正在查看不同的流程,例如,由Popen()启动的子流程可能依次启动孙子流程,并且在孙子继续运行时退出wpa_supplicant,或者您可能会看到一些与之无关的流程你的脚本过程。将wpa_supplicant.pid与您在流程表中看到的内容进行比较,找出您正在观察的场景(如果它们接近则前者比后者更可能)。

特定返回码的含义取决于命令,例如ssh returns 255 in case of an error(否则它返回它运行的远程命令的退出状态 - 255 indicates wrong argument to the exit builtin in bash,因此它不太可能远程程序生成它)。移除stdout=open('/dev/null', 'w'),将错误视为@Andrea Corbellini suggested