我在OSX上运行Python3;到目前为止,我一直在使用终端推出的控制台应用程序),根据我的理解,终端是产生进程,他们是产生者的孩子,所以当它消失时,所有子进程都被终止。
虽然,现在我正在运行UI;尝试使用TKinter,然后继续使用PyQt5。在这种情况下,我遇到一些问题,我的测试过程没有关闭,因为它发生在终端,但挂起僵尸。虽然我认为僵尸程序并不是一个大问题,但我担心的是,就流程所有权而言,我无法控制或理解“谁在闯船”。
有没有办法获得一种树,关于哪个进程持有另一个进程(或多个进程);所以我可以处理订单并关闭正确的订单?也出于某种原因,即使在僵尸进程中给出sudo kill -9
也不会杀死它;所以我真的很想知道后端发生了什么,并正确处理事情。
答案 0 :(得分:0)
PyQt是实际Qt C代码的Python绑定,当你启动PyQt应用程序时,你正在启动Python进程和C Qt循环进程。
你有僵尸进程,因为当你终止你的python进程时,你不一定会终止C进程。
这就是事情,在PyQt中,当删除Qt对象时,它会删除与它相关的所有其他Qt Ojbects(子项,子项等),但是如果有一个没有父项或者不知何故无法访问,它将成为一个僵尸进程,你将无法杀死它,除非你重置你的计算机或你找到并杀死Qt循环。
因此,为了让您的生活更轻松,您应该将代码设置为具有1个主对象,并且所有其他对象应与其相关,因此当您终止应用程序时,您只需要删除一个对象和所有其他对象的遗嘱被正确删除。
在一个简单的应用程序中你会有这样的东西:
app = QApplication(sys.argv)
main = MainObject()
main.show()
sys.exit(app.exec_())
退出由sys.exit(app.exec_())
处理,您的所有应用对象都从main继承。
但是如果你想在执行期间删除一个Qt对象,你就不能像在python中那样删除它。您必须让Qt通过将删除设置为删除来处理删除:
object.deleteLater()
您可以通过ekhumoro
在此答案中对此进行更好的解释