如何在树莓派上退出 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
我在 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