2016-03-21 12 views
1

dieser Code Gegeben zu handhaben:Wie Konsole verlassen und Objekt Zerstörung

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() 

während der t.watch(), ich möchte diese Anwendung in der Konsole schließen ..

Ich versuchte CTRL+C verwenden und es funktioniert: enter image description here

wenn ich jedoch die Exit-Button klicken:
enter image description here

es funktioniert nicht .. Ich habe dies viele ähnliche Fragen zu, aber es scheint, dass ich nicht die richtige Antwort ..

finden können, was ich tun möchte:

Die Konsole verlassen werden kann während das Programm noch läuft .. um das zu handhaben, wenn die Exit-Taste gedrückt wird, möchte ich eine Aufräumung der Objekte (Löschen von erstellten temporären Dateien), Rollback von temporären Änderungen, etc ..

Frage :

  1. Wie kann ich mit dem Konsolen-Exit umgehen?
  2. Wie kann ich es in Objektdestruktoren integrieren (__exit__())
  3. Ist es überhaupt möglich? (Wie etwa py2exe?)

Hinweis: Code wird auf py2exe kompiliert werden .. „hofft, dass die Wirkung ist die gleiche“

+0

umm, was? Wenn Sie das X drücken, wird die Anwendung nicht vom Betriebssystem gelöscht? – gsamaras

+0

@gsamaras, ja, aber ich möchte einige Objekt Bereinigung tun, nachdem die X-Taste gedrückt wird .. deshalb .. Ich werde es in meiner Frage hinzufügen .. – catzilla

+0

Wenn Sie X-Taste drücken Sie töten Elternprozess Ihres Python Prozess ... wenn Sie STRG + C drücken, unterbrechen Sie Ihren Python-Prozess, und er geht in Ihren Ausnahmebehandlungsblock ... was ich meine, ist das Drücken der X-Taste führt Ihr Programm nicht zur Ausnahmebehandlung, und meine Frage ist was Sie tun willst du machen? –

Antwort

2

Sie möchten vielleicht einen Blick auf signals haben. Wenn ein * nix-Terminal mit einem laufenden Prozess geschlossen wird, empfängt dieser Prozess ein paar Signale. Zum Beispiel wartet dieser Code auf das SIGHUB Hangup-Signal und schreibt eine letzte Nachricht. Dieser Code funktioniert unter OSX und Linux. Ich weiß, dass Sie speziell nach Windows fragen, aber vielleicht möchten Sie es ausprobieren oder untersuchen, welche Signale eine Windows-Eingabeaufforderung beim Herunterfahren auslöst.

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 

Zitat aus der Dokumentation:

Unter Windows Signal() kann nur mit SIGABRT, SIGFPE, SIGILL, SIGINT, SIGSEGV oder SIGTERM genannt werden. Ein ValueError wird in jedem anderen Fall ausgelöst.

aktualisieren:

die nächste Sache in Windows Eigentlich ist win32api.setConsoleCtrlHandler (doc). Dies war bereits here diskutiert:

Bei der Verwendung von win32api.setConsoleCtrlHandler(), ich bin in der Lage shutdown/Abmelde/etc Ereignisse von Windows und sauber heruntergefahren meine App zu erhalten.

Und wenn Daniel's code noch funktioniert, könnte dies eine nette Art und Weise sein, beide (Signale und CtrlHandler) zu verwenden, für die plattformübergreifende Zwecke:

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

dies Antwort funktioniert am nächsten zu dem, was ich suche .. Ich werde das zuerst versuchen und es scheint, dass das Signal 'SIGTERM' ist, was ich suche .. muss das überprüfen. – catzilla

0

Wenn Sie tempfile verwenden Ihre temporäre Datei zu erstellen, es wird automatisch gelöscht, wenn der Python-Prozess beendet wird.

Versuchen Sie es mit:

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

nun prüfen, ob die angegebene Datei vorhanden ist. Sie können von dieser Datei wie jede andere schreiben und lesen.
nun die Python-Fenster töten und prüfen, ob Datei (es sein soll)

ist weg Sie einfach foo.close() nennen können es in Ihrem Code manuell zu löschen.

Verwandte Themen