如何在树莓派上退出 python 程序

How to exit python program on raspberry

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

退出我的程序时,我尝试清除所有资源,并删除所有实例。 对于网络对象,我关闭监听套接字等。 我以 sys.exit() 调用结束,但程序没有退出,也没有 returns 单独到 linux 控制台(我需要按 ctrl+z)。

有没有对象没有释放,怎么知道,怎么强制退出?

此致。

我正在使用 Kivy 库为 Raspberry Pi 编程,我遇到了类似的问题。这个话题的评论帮我解决了

在我的例子中,Kivy 使用 "Clock()" 对象以特定的时间间隔调用函数,提供主程序循环。

事实证明,虽然在 PC 上一切正常(在 Linux 或 Windows 中),但在 Raspberry Pi 上您必须手动停止所有程序循环,否则 "sys.exit()" 将不起作用。

起初,我让 "sys.exit()" 命令在按键时执行。这对 Raspberry 不起作用。所以,我使用了一个全局变量,当按下退出键时它会改变值,并在程序循环中检查它的值,然后我调用 "sys.exit()"(和 "return False",它向 Kivy 发出信号销毁 Clock() 对象。

我也一直在为我的程序中的一些动画使用单独的 Clock() 对象,我注意到如果我在动画 运行 时按退出键,我的程序会冻结而不退出 -和以前一样,因为 "sys.exit()" 被调用,而一些 Clock() 对象是 运行.

底线是 - 如果您在 Raspberry Pi 上遇到 "sys.exit()" 问题,请确保在调用 之前停止代码中的所有程序循环=41=]().

作为最简单的例子,如果你有一个程序运行一个像

这样的循环
while True:

改为使用

while running:
   # where running = True

然后在调用 "sys.exit()" 之前更改为 "running = False"。

我在 Pi 上编写一个简单的 GPIO 应用程序时遇到了类似的问题。我正在使用 GPIOZero 库,正如他们的代码示例所暗示的那样,我正在使用 signal.pause() 等待按钮按下。这会导致您描述的行为 - 即使 sys.exit() 也不会退出!

解决方案是,当代码完成时,这样做:

# Send a SIGUSER1 signal; this will cause signal.pause() to finish. os.kill(os.getpid(), signal.SIGUSR1)

如果您不介意系统在控制台上打印 "User defined signal 1",您甚至不必定义信号处理程序。

HTH