鉴于此代码:
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()
期间,我想在控制台中关闭此应用程序..
它不起作用..我检查了很多相关的问题,但似乎我找不到合适的答案..
我想做什么:
当程序仍在运行时可以退出控制台..要处理它,当按下退出按钮时,我想清理对象(删除创建的临时文件),回滚临时更改等..
问题:
__exit__()
)注意:代码将在py2exe上编译。"希望效果相同"
答案 0 :(得分:2)
您可能需要查看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
来自文档的引用:
在Windows上,只能使用SIGABRT,SIGFPE,SIGILL,SIGINT,SIGSEGV或SIGTERM调用signal()。在任何其他情况下都会引发ValueError。
<强>更新强>:
实际上,Windows中最接近的是win32api.setConsoleCtrlHandler
(doc)。这已经讨论过here:
使用win32api.setConsoleCtrlHandler()时,我能够从Windows接收关闭/注销/ etc事件,并干净地关闭我的应用程序。
如果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!"
答案 1 :(得分:0)
如果您使用tempfile
创建临时文件,则会在Python进程被终止时自动删除它。
尝试使用:
>>> foo = tempfile.NamedTemporaryFile()
>>> foo.name
'c:\\users\\blah\\appdata\\local\\temp\\tmpxxxxxx'
现在检查指定的文件是否存在。您可以像写任何其他文件一样写入和读取此文件 现在杀死Python窗口并检查文件是否已经消失(应该是)
您只需拨打foo.close()
即可在代码中手动删除它。