我在python中的程序在RaspBerry Pi上运行,并实例化几个对象(GPIO输入和输出,http服务器,webSocket,I2C接口等等,带线程)。
退出程序时,我会尝试清除所有资源,并删除所有实例。
对于网络对象,我关闭侦听套接字等。
我以sys.exit()
调用完成,但是程序不会退出并且不会单独返回到linux控制台(我需要按ctrl + z)。
是否有一些未被释放的对象,如何知道以及如何强制退出?
最好的问候。
答案 0 :(得分:0)
我正在使用Kivy库为Raspberry Pi编程,我遇到了类似的问题。本主题中的评论帮助我解决了这个问题。
就我而言,Kivy使用“Clock()”对象以一定的时间间隔调用函数,提供主程序循环。
事实证明,虽然在PC上(在Linux或Windows中)一切正常,但在Raspberry Pi上你必须手动停止所有程序循环,否则“sys.exit()”将无效。
首先,我按下了“sys.exit()”命令。这对Raspberry不起作用。所以,我使用了一个全局变量,它会在按下退出键时改变值,并在程序循环中检查其值,然后我调用“sys.exit()”(和“返回False”,这表示Kivy销毁Clock()对象。)
我一直在我的程序中使用单独的Clock()对象来制作动画,我注意到如果我在动画运行时按退出,我的程序会冻结而不会退出 - 就像之前一样,因为“在一些Clock()对象运行时调用了sys.exit()。
底线是 - 如果你在Raspberry Pi上遇到“sys.exit()”问题,在调用sys.exit()之前确保代码中的所有程序循环都已停止。 / p>
作为最简单的例子,如果你有一个程序运行像
这样的循环while True:
改为使用
while running:
# where running = True
然后在调用“sys.exit()”之前更改为“running = False”。
答案 1 :(得分:0)
我在Pi上编写一个简单的GPIO应用程序时遇到类似的问题。我正在使用GPIOZero库,并且正如他们的代码示例所建议的那样,我正在等待使用signal.pause()
进行按钮按下。这会导致您描述的行为-甚至sys.exit()
都不会退出!
解决方案是在代码完成的时候执行此操作:
# Send a SIGUSER1 signal; this will cause signal.pause() to finish.
os.kill(os.getpid(), signal.SIGUSR1)
如果您不介意系统在控制台上打印“用户定义的信号1”,则甚至不必定义信号处理程序。
HTH