2016-03-21 8 views
1

Учитывая этот код:Как обращаться с консолью выхода и уничтожение объекта

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 .. «надеется, что эффект такой же»

+0

umm, что? Когда вы нажмете X, приложение не будет уничтожено операционной системой? – gsamaras

+0

@gsamaras, да, однако я хочу сделать некоторую очистку объектов после нажатия кнопки x .. вот почему .. Я добавлю это в свой вопрос .. – catzilla

+0

, когда вы нажмете кнопку X, вы убиваете родительский процесс вашего питона процесс ... когда вы нажимаете CTRL + C, вы прерываете свой процесс python, и он входит в блок обработки исключений ... что я имею в виду, нажатие кнопки X не приводит вашу программу к блоку обработки исключений, и мой вопрос в том, что делать u хотеть сделать ? –

ответ

2

Вы можете посмотреть на signals. Когда терминал * nix закрыт запущенным процессом, этот процесс получает пару сигналов. Например, этот код ожидает сигнала SIGHUB hangup и записывает окончательное сообщение. Эти коды работают под 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. ValueError будет поднят в любом другом случае.

Update:

На самом деле, самая близкая вещь в Windows, является win32api.setConsoleCtrlHandler (doc). Это уже обсуждалось here:

При использовании win32api.setConsoleCtrlHandler(), я могу получить выключение/выход из системы/и т.д. события из Windows, и аккуратно закрыл мое приложение.

И если 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!" 
+0

это ответ работает ближе всего к тому, что я ищу .. Я попробую это первым, и кажется, что сигнал 'SIGTERM' - это то, что я ищу .. должен проверить это. – catzilla

0

Если вы используете tempfile создать временный файл, будет автоматически удаляться, когда процесс Python будет убит.

Попробуйте с:

>>> foo = tempfile.NamedTemporaryFile() 
>>> foo.name 
'c:\\users\\blah\\appdata\\local\\temp\\tmpxxxxxx' 

Теперь проверьте, что указанный файл существует. Вы можете писать и читать из этого файла, как и любой другой.
Теперь убейте окно Python и проверить, что файл исчез (он должен быть)

Вы можете просто позвонить foo.close(), чтобы удалить его вручную в коде.