保证在流程终止时要求销毁

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

BPL*_*BPL 1

我没有正确测试,因为我没有在这里安装 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+CCTRL+BREAK发出信号:

在此输入图像描述