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

时间:2016-03-21 08:32:53

标签: python py2exe

鉴于此代码:

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怎么样?)
  4. 注意:代码将在py2exe上编译。"希望效果相同"

2 个答案:

答案 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.setConsoleCtrlHandlerdoc)。这已经讨论过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()即可在代码中手动删除它。