2011-01-04 5 views
1

Ich habe ein GUI-Programm, das auch über CLI steuerbar sein sollte (zur Überwachung). Die CLI wird in einer while-Schleife mit raw_input implementiert. Wenn ich das Programm über eine Schaltfläche zum Schließen der GUI verlasse, hängt es in raw_input und wird erst beendet, wenn es eine Eingabe erhält.Python: Wie CLI zu beenden, wenn blockiert in Raw_input?

Wie kann ich raw_input sofort abbrechen, ohne eine Eingabe einzugeben?

ich es auf WinXP laufen, aber ich will es plattformunabhängig sein, sollte es auch in Eclipse arbeiten, da es ein Entwickler-Tool ist. Python-Version ist 2.6.

Ich suchte Stackoverflow für Stunden und ich weiß, es gibt viele Antworten zu diesem Thema, aber gibt es wirklich keine plattformunabhängige Lösung, um einen nicht blockierenden CLI-Leser zu haben?

Wenn nicht, was wäre der beste Weg, um dieses Problem zu überwinden?

Dank

+0

"ohne einen zusätzlichen Schlüssel zu drücken, um aus dem raw_input herauszukommen?" Was bedeutet das? Kannst du erklären, was du damit meinst? Das Ende der Datei ist ein Schlüssel. Control-C, um das Programm zu beenden, ist ein Schlüssel. Was ist der "zusätzliche" Schlüssel, über den Sie sich Sorgen machen? Bitte erläutern. –

+0

Um das Programm zu beenden, kann ich entweder 'quit' in der CLI eingeben oder über die GUI schließen. Wenn ich das Programm über die GUI beenden, hängt die CLI in Raw_input, bis ich etwas in der CLI eingeben. Wie kann ich raw_input sofort abbrechen, ohne eine Eingabe eingeben zu müssen? – schluchc

+0

@ S.Lott: Ich habe die Frage bearbeitet, bitte sagen Sie mir, ob es jetzt klar ist. – schluchc

Antwort

2

Das ist vielleicht nicht die beste Lösung, aber Sie könnten die thread module verwenden, die eine Funktion thread.interrupt_main() hat. So können zwei Threads laufen: einer mit Ihrer raw_input-Methode und einer, der das Unterbrechungssignal geben kann. Der Thread der höheren Ebene löst eine KeyboardInterrupt-Ausnahme aus.

import thread 
import time 

def main(): 
    try: 
     m = thread.start_new_thread(killable_input, tuple()) 
     while 1: 
      time.sleep(0.1) 
    except KeyboardInterrupt: 
     print "exception" 

def killable_input(): 
    w = thread.start_new_thread(normal_input, tuple()) 
    i = thread.start_new_thread(wait_sometime, tuple()) 


def normal_input(): 
    s = raw_input("input:") 


def wait_sometime(): 
    time.sleep(4) # or any other condition to kill the thread 
    print "too slow, killing imput" 
    thread.interrupt_main() 

if __name__ == '__main__': 
    main() 
+1

Wenn ich recht habe, können Ausnahmen nicht behandelt werden, bevor raw_input beendet ist. Es ist also immer noch eine Eingabe erforderlich und danach kann die Ausnahme behandelt werden.Ich habe bereits versucht, eine Ausnahme von einem anderen Thread zu werfen. – schluchc

+0

Vielleicht ist es nicht auf Windows, weil dieser Code auf Linux funktioniert (wenn ja dann vergessen, was ich gesagt habe). –

+0

Sie haben recht, mit 'thread.interrupt_main()' funktioniert es auch unter Windows. Vielen Dank! – schluchc

1

Je nachdem, welche GUI-Toolkit Sie verwenden, einen Weg finden, einen Ereignis-Listener zum Fenster schließen Aktion anzuschließen und es win32api.TerminateProcess(-1, 0) machen nennen.

Als Referenz auf Linux Aufruf sys.exit() funktioniert.

+0

Ich rufe sys.exit(), aber das Problem ist, dass der Ausgang wartet auf raw_input zu beenden was passiert nicht, bevor ich eine andere Taste drücke. – schluchc

+0

@christian Ah, du bist auf Windows (lies die Frage noch einmal). Wird die Antwort aktualisieren. – marcog

+0

@christian Aktualisiert – marcog