我已经使用该库创建了一个Python应用程序的可执行文件
pyinstaller
。
当通过双击启动
*.exe
时,带有 python 控制台的窗口启动并且应用程序开始运行。
现在,当我使用每个窗口右上角的 X 关闭应用程序时,我想在应用程序最终停止之前执行一些代码。
这是我的代码片段,它给出了我正在尝试做的事情的示例:
def exit_handler():
# This code should get executed before the application finally terminates
print("I want this to print")
sys.exit()
def main(*args):
atexit.register(exit_handler)
signal.signal(signal.SIGTERM, exit_handler)
signal.signal(signal.SIGINT, exit_handler)
uvicorn.run(app, host="0.0.0.0", port=8000)
不幸的是,在使用
signal
构建可执行文件时,使用 atexit
语句和 pyinstaller
库不起作用。
有谁知道这个问题的解决方案吗?
在 Unix 类型系统上尝试一下:
from atexit import register
from time import sleep
from signal import signal, SIGINT, SIGTERM
def end():
print('Goodbye')
def handler(*_):
print('Signalled')
exit()
register(end)
signal(SIGINT, handler)
signal(SIGTERM, handler)
sleep(5)
注意信号处理程序和 atexit 函数之间的区别。
运行此程序并等待至少 5 秒钟。输出将是:
Goodbye
运行该程序并在 5 秒过去之前中断它(例如,Ctrl-C)。输出将是:
^CSignalled
Goodbye