2016-04-10 4 views
1

Verwenden des Python Cmd2-Moduls (erbt von Cmd), um eine MyCmd-CLI für mein Programm zu erstellen. In den meisten Fällen verwende ich mein Skript normalerweise mit den integrierten Befehlen. Der Befehl 'quit' wurde implementiert, um das Skript zu bereinigen und anschließend zu beenden. Das Cmd2-Modul wartet auf die Eingabe über den raw_input.Befehl wird programmatisch in den cmdloop von Python Cmd eingefügt

In einem bestimmten Fall möchte ich "quit" programmgesteuert aufrufen, anstatt es an der Befehlszeile auszugeben. Dies geschieht über einen separaten Thread, bei dem eine REST-API einen POSIT-Befehl "quit" übersetzt, um quit im Hauptthread des Skripts aufzurufen.

Ich habe ein paar SO Fragen gefunden, die etwas ähnliches machen wollen, aber nicht genau so. Ich habe versucht, das folgende Beispiel zu folgen, aber es hat nicht funktioniert: Python StringIO - selectively place data into stdin

Dann habe ich etwas Einfaches versucht. Im Grunde genommen hat die unten aus dem Thread:

sys.stdin = StringIO('quit\n') 
sys.stdin.flush() 

Es scheint, dass das Wort ‚verlassen‘ injiziert, aber das Skript würde nicht seine saubere Ausfahrt tun. Ich könnte jedoch zur Befehlszeile zurückkehren und einfach die Eingabetaste drücken, wodurch der Bereinigungs- und Beendigungsprozess ausgelöst wird. Nicht sicher, warum '\ n' nicht als Enter interpretiert wurde.

ist mein cmd einfach in der unten stehenden Weise aufgerufen:

mycmd = MyCmd() 
mycmd.cmdloop() 

Wie kann ich in die cmdloop von Cmd richtig injizieren ‚beenden‘?

+0

ist es möglich, dass Sie versuchen, ['Cmd.postcmd'] (https://docs.python.org/2/library/cmd.html#cmd.Cmd.postcmd) zu überschreiben? –

+0

Von dem, was ich sagen kann, wird der Aufruf einer Methode direkt nicht funktionieren, weil sie außerhalb des Cmdloops aufgerufen werden. Daher wird die Rückgabe von True (zum Beenden von cmdloop) nicht an cmdloop übergeben, sondern an den aufrufenden Code, der außerhalb von cmdloop ausgeführt wird. – bhairav

Antwort

0

Haben Sie die Methode cmd.onecmd ("quit") ausprobiert? Ich denke, es kann verwendet werden, um Befehle in den Interpreter zu injizieren.

Verwandte Themen