提问人:kamaru510 提问时间:9/6/2023 最后编辑:kamaru510 更新时间:9/7/2023 访问量:69
在 python 可执行文件中实现退出例程
Implement exit routine in python executable
问:
我使用该库创建了 python 应用程序的可执行文件。pyinstaller
当通过双击启动时,带有 python 控制台的窗口将启动,应用程序开始运行。
现在,当我使用每个窗口右上角的 X 关闭应用程序时,我想在应用程序最终停止之前执行一些代码。*.exe
这是我的代码片段,它给出了我尝试执行的操作的示例:
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
更新:我正在使用 Windows 操作系统
答:
1赞
Codist
9/6/2023
#1
在 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
评论
1赞
kamaru510
9/6/2023
感谢您的回答,但我无法使用此应用程序迁移到 Unix 类型系统。它旨在在 Windows 主机上运行
1赞
Codist
9/7/2023
@kamaru510 在这种情况下,我建议您研究尝试在 Windows 上使用 SIGINT 和 SIGTERM 信号的可行性。如果你在 Windows 系统上尝试这个答案中的代码,并且它的行为方式与我描述的方式不同,那么你就会知道你的方法不是可移植的
0赞
kamaru510
9/7/2023
我上面发布的代码适用于我的 Windows 机器,但前提是我启动 main.py 脚本。当我启动从该应用程序制作的可执行文件时,它不起作用。在我看来,这个问题与.我需要研究当我通过 X 关闭打开的控制台时会发送什么样的信号pyinstaller
0赞
Codist
9/7/2023
@kamaru510 如评论中所述,您在问题中发布的代码存在缺陷
0赞
kamaru510
9/7/2023
当然,这可能是,我已经根据收到的建议对其进行了改进。但即使它奏效了。它在运行可执行文件时也有效,但前提是我使用 CTRL+C 终止应用程序。
0赞
kamaru510
9/7/2023
#2
我终于找到了解决我的问题的方法。与大多数情况一样,对文档的准确阅读会带来解决方案。感谢大家的努力。
评论
file=sys.stderr
print
stderr
stdout
flush=True
print
stdout
sys.exit()
atexit.register
atexit.register(exit_handler)
atexit.register(print, "I want this to print", file=sys.stdout)
exit_handler
print
sys.exit