gpt4 book ai didi

python - 如何处理控制台退出和对象销毁

转载 作者:行者123 更新时间:2023-11-30 22:58:34 25 4
gpt4 key购买 nike

鉴于此代码:

from time import sleep

class TemporaryFileCreator(object):
def __init__(self):
print 'create temporary file'
# create_temp_file('temp.txt')

def watch(self):
try:
print 'watching tempoary file'
while True:
# add_a_line_in_temp_file('temp.txt', 'new line')
sleep(4)
except (KeyboardInterrupt, SystemExit), e:
print 'deleting the temporary file..'
# delete_temporary_file('temp.txt')
sleep(3)
print str(e)



t = TemporaryFileCreator()
t.watch()

t.watch()期间,我想在控制台中关闭此应用程序..

我尝试使用CTRL+C并且它有效: enter image description here

但是,如果我单击退出按钮:
enter image description here

它不起作用..我检查了很多与此相关的问题,但似乎找不到正确的答案..

我想做的事情:

控制台可以在程序仍在运行时退出。为了处理这个问题,当按下退出按钮时,我想清理对象(删除创建的临时文件),回滚临时更改等..

问题:

  1. 如何处理控制台退出?
  2. 如何将其集成到对象析构函数上 (__exit__())
  3. 这可能吗? (py2exe 怎么样?)

注意:代码将在py2exe上编译..“希望效果是一样的”

最佳答案

您可能想看看signals 。当 *nix 终端因正在运行的进程而关闭时,该进程会收到几个信号。例如,此代码等待 SIGHUB 挂断信号并写入最终消息。该代码可在 OSX 和 Linux 下运行。我知道您特别要求使用 Windows,但您可能想尝试一下或调查 Windows 命令提示符在关机期间发出的信号。

import signal
import sys
def signal_handler(signal, frame):
with open('./log.log', 'w') as f:
f.write('event received!')

signal.signal(signal.SIGHUP, signal_handler)
print('Waiting for the final blow...')
#signal.pause() # does not work under windows
sleep(10) # so let us just wait here

引用文档:

On Windows, signal() can only be called with SIGABRT, SIGFPE, SIGILL, SIGINT, SIGSEGV, or SIGTERM. A ValueError will be raised in any other case.

更新:

实际上,Windows 中最接近的是 win32api.setConsoleCtrlHandler ( doc )。这已经讨论过here :

When using win32api.setConsoleCtrlHandler(), I'm able to receive shutdown/logoff/etc events from Windows, and cleanly shut down my app.

如果 Daniel's code仍然有效,这可能是使用两者(信号和 CtrlHandler)实现跨平台目的的好方法:

import os, sys
def set_exit_handler(func):
if os.name == "nt":
try:
import win32api
win32api.SetConsoleCtrlHandler(func, True)
except ImportError:
version = “.”.join(map(str, sys.version_info[:2]))
raise Exception(”pywin32 not installed for Python ” + version)
else:
import signal
signal.signal(signal.SIGTERM, func)

if __name__ == "__main__":
def on_exit(sig, func=None):
print "exit handler triggered"
import time
time.sleep(5)

set_exit_handler(on_exit)
print "Press to quit"
raw_input()
print "quit!"

关于python - 如何处理控制台退出和对象销毁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36126165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com