Roh*_*ohi 6 python operating-system python-3.x
在阅读了很多关于这个主题的数据之后,我仍然找不到任何解决我问题的方法(可能没有).
我的问题如下:
在我的项目中,我有多个驱动程序使用各种硬件(IO管理器,可编程负载,电源等).
初始化连接到这些硬件的成本很高(时间),和我不能打开,然后关闭了我们之间的每一次迭代的通信连接.
意思是我不能这样做(假设可编程加载实现进入/退出):
start of code...
with programmable_load(args) as program_instance:
programmable_load_instance.do_something()
rest of code...
Run Code Online (Sandbox Code Playgroud)
所以我选择了另一种解决方案:
class programmable_load():
def __init__(self):
self.handler = handler_creator()
def close_connection(self):
self.handler.close_connection()
self.handler = None
def __del__(self):
if (self.handler != None):
self.close_connection()
Run Code Online (Sandbox Code Playgroud)
出于显而易见的原因,我不"信任"析构函数实际被调用,因此当我想结束我的程序时(对于所有驱动程序),我明确地调用close_connection().
当我突然终止进程时会出现问题,例如当我通过调试模式运行并退出调试时.
在这些情况下,进程终止而不运行任何析构函数.我知道操作系统会清除此时未使用的所有内存,但有没有办法以有条理的方式清除内存?
如果没有,有没有办法让退出调试功能通过一组特定的功能?python进程是否知道它有一个非常好的调试事件,还是将它视为正常终止?
操作系统:Windows
我没有正确测试,因为我没有在这里安装 wingide,所以我不能保证这会起作用,但是使用setconsolectrlhandler怎么样?例如,尝试这样的事情:
import os
import sys
import win32api
if __name__ == "__main__":
def callback(sig, func=None):
print("Exit handler called!")
try:
win32api.SetConsoleCtrlHandler(callback, True)
except Exception as e:
print("Captured exception", e)
sys.exit(1)
print("Press to quit")
input()
print("Bye!")
Run Code Online (Sandbox Code Playgroud)
它将能够处理CTRL+C和CTRL+BREAK发出信号: