如何在覆盆子上退出python程序

时间:2016-02-04 14:05:11

标签: python exit raspberry-pi2

我在python中的程序在RaspBerry Pi上运行,并实例化几个对象(GPIO输入和输出,http服务器,webSocket,I2C接口等等,带线程)

退出程序时,我会尝试清除所有资源,并删除所有实例。 对于网络对象,我关闭侦听套接字等。 我以sys.exit()调用完成,但是程序不会退出并且不会单独返回到linux控制台(我需要按ctrl + z)。

是否有一些未被释放的对象,如何知道以及如何强制退出?

最好的问候。

2 个答案:

答案 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