【问题标题】:subprocess poll() returning wrong value子进程 poll() 返回错误值
【发布时间】:2016-02-04 11:46:08
【问题描述】:

我正在启动一个进程并将其存储在一个变量中:

 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() 读取值,但它似乎不可靠。知道为什么会发生这种情况吗?

【问题讨论】:

  • 如果 poll() 返回 255,这意味着您的进程以状态 255 退出。尝试阅读其 stdout/err 找出原因(删除 stdout=open('/dev/null','w')
  • 离题:存在subprocess.DEVNULL
  • @AndreaCorbellini 谢谢,不知道存在。我找到了问题,将回复 Sebastian 给出的答案。
  • 但是os.devnull已经存在于2.7中。

标签: python subprocess


【解决方案1】:

我可以看到wpa_supplicant确实启动了。

如果.poll() 返回一个非None 值;这意味着进程dead,而且它已经reaped(状态已读取),也就是说,您不会在进程表中看到任何内容。如果你在.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

【讨论】:

  • 谢谢塞巴斯蒂安,我已经找到了。该代码在守护程序中运行,并且已静默重新启动,这导致了问题。修复守护进程重启的问题解决了这个问题。
猜你喜欢
  • 2016-11-03
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
  • 2012-10-10
  • 1970-01-01
  • 2011-03-01
  • 2018-07-19
  • 1970-01-01
相关资源
最近更新 更多