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

3
我的Python程序在Raspberry Pi上运行,并实例化了几个对象(包括GPIO输入和输出、HTTP服务器、WebSocket、I2C接口等,以及线程)。
当退出我的程序时,我尝试清除所有资源并删除所有实例。对于网络对象,我关闭监听套接字等。最后使用sys.exit()调用,但程序没有退出,也没有自动返回到Linux控制台(我需要按ctrl+z键)。
是否有一些未释放的对象?如何知道并强制退出?
此致敬礼。

你提到了线程:非守护线程不会被 sys.exit() 杀死并且可以保持进程的运行。你可以使用active_countenumerate检查正在运行的线程。 - Andrea Corbellini
我尝试了你建议的 threading.enumerate 方法,得到的线程列表如下: <WriterThread(pydevd.Writer, started daemon 8992)> <Thread(QueueFeederThread, started daemon 4960)> <_Timer(Thread-6, started 652)> <PyDBCommandThread(pydevd.CommandThread, started daemon 7532)> <ReaderThread(pydevd.Reader, started daemon 8784)> <_MainThread(MainThread, started 4180)> <_Timer(Thread-5, started 7384)> 我不知道这些线程是什么意思... - user4657635
请编辑您的问题,添加这些信息(以便更容易阅读)。正如您所看到的,大多数线程都是守护进程,因此您可以忽略它们。唯一的非守护进程是两个 _Timer。检查它们(它们应该有一个.function属性)。 - Andrea Corbellini
好的(我之前遇到了一个问题,按下“回车”键会关闭评论窗口。现在我找到了“shift”+“enter”的方法)。<br/> 我不理解“.function”属性,但我已经使用了:<br/> if type(x) is threading._Timer: x.cancel() <br/> 对吗? - user4657635
这样做可以取消计时器:如果这是你想要的,那就去做吧。我建议先调查一下为什么这些计时器会出现。再次提醒:请不要在评论中编写代码/输出,而是编辑您的问题。 - Andrea Corbellini
2个回答

0
我正在使用Kivy库为Raspberry Pi编程,遇到了类似的问题。这个主题中的评论帮助我解决了问题。
在我的情况下,Kivy使用“Clock()”对象以一定的时间间隔调用函数,提供主程序循环。
事实证明,在PC上(Linux或Windows),一切都正常工作,但在Raspberry Pi上,您必须手动停止所有程序循环,否则“sys.exit()”将无法工作。
起初,我在按键时执行“sys.exit()”命令。这对树莓派不起作用。因此,我使用了一个全局变量,当按下退出键时,该变量会改变值,并在程序循环中检查其值,然后调用“sys.exit()”(和“return False”,这表明Kivy销毁了Clock()对象)。
我还在程序中使用了单独的Clock()对象来进行一些动画,我注意到,如果我在动画运行时按退出键,我的程序将被冻结而不会退出-就像之前一样,因为在某些Clock()对象正在运行时调用了“sys.exit()”。
底线是-如果您在Raspberry Pi上遇到“sys.exit()”问题,请确保在调用sys.exit()之前停止代码中的所有程序循环。
作为最简单的例子,如果您有一个运行循环的程序,如下所示:
while True:

应该使用

while running:
   # where running = True

在调用 "sys.exit()" 之前,将其更改为 "running = False"。


0

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

解决方案是,在代码完成时执行以下操作:

# 发送SIGUSER1信号;这将导致signal.pause()结束。 os.kill(os.getpid(), signal.SIGUSR1)

如果您不介意系统在控制台上打印“用户定义的信号1”,则甚至不必定义信号处理程序。

希望对您有所帮助


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接