Arbeiten mit Flüchen in IPython. Wie kann ich das verbessern?

Ich habe einen Weg gefunden, um interaktiv mit Flüchen zu arbeiten und trotzdem die meisten Vorteile von IPython zu nutzen. Es funktioniert mit einigen Einschränkungen, aber nicht so gut, wie ich es gerne hätte.

Das ursprüngliche Problem ist natürlich, dass ich in der Lage sein möchte, mit meiner interaktiven Python-Sitzung zu arbeiten, während sie einen Terminalbildschirm mit dem Modul curses (ncurses) steuert (oderurwid, zum Beispiel). Eine Lösung besteht darin, einen einfachen TCP-Server mit einer einfachen Ereignisschleife zu schreiben, die jede vom Socket gelesene Zeichenfolge auswertet und serialisierte Zeichenfolgen zurücksendet, die Ergebnisse darstellen und zurückgeben. Wie hier beschrieben:SO: Gibt es eine Möglichkeit, eine Python-Curses-Anwendung interaktiv zu programmieren?).

Hier ist ein etwas einfacherer Trick (vorausgesetzt, Sie haben IPython installiert).

    #!/usr/bin/python 
    #!/usr/bin/env python 
    from IPython import embed_kernel
    import curses

    def interact_with_curses(screen):
        '''set global stdscr variable and run embedded IPython kernel
           suitable to be called by curses.wrapper()
        '''
        global stdscr
        stdscr = screen
        embed_kernel()

    if __name__ == '__main__':
        curses.wrapper(interact_with_curses)

(leicht gemungt, um die Syntax-Hervorhebung von SO glücklich zu machen).

Wenn Sie dies ausführen, erhalten Sie eine Ausgabe in etwa wie folgt:

 [IPKernelApp] To connect another client to this kernel, use:
            [IPKernelApp] --existing kernel-2869.json

Und wechseln Sie zu einem anderen Fenster oder einer anderen Bildschirmsitzung, die Sie ausführen können:

ipython console --existing kernel-2869.json

Sich mit diesem Prozess verbinden und damit arbeiten.

Das ist schön genug. Sie können dann Dinge wie anrufenstdscr.refresh(). Arbeiten Sie mit Ihren Curses / Window- und Pad-Objekten, rufen Sie andir() Erkundigen Sie sich bei ihnen nach ihren Funktionen und arbeiten Sie im Allgemeinen mit dem Code, als ob Sie sich in einer normalen IPython-Sitzung befänden, bei der lediglich der Bildschirm eines anderen Terminals aktualisiert und auch von diesem gelesen wird (mithilfe der Eingabefunktionen für Flüche).

Probleme mit diesem Ansatz und Fragen:

Zum Beenden muss ich anscheinend quit () von der IPython-Konsole aus ausführen, und dies beendet den Interpreter nicht auf normale Weise. Es scheint nicht zu erlaubencurses.wrapper() um das terminal zurückzusetzen und verschiedene versuche anzurufen.endwin(), .resetty() (nachdem a.savetty() Na sicher),.reset_shell_mode() (und.reset_prog_mode()) und so weiter sind alle gescheitert. Ich habe versucht, sie nach dem Anruf in main anzurufencurses.wrapper() und ich habe versucht, sie mit zu registrierenatexitWie kann ich eine solche Sitzung sauber beenden?[Tab] Vervollständigung funktioniert nichtWie kann ich erreichen, dass IPythons [Tab] eine IPython-Konsolensitzung mit einem dieser eingebetteten Kernel vollständig durchläuft?IPython aufrufenembed_kernel() Die Funktion druckt die Socket-Informationen auf den Curses-Bildschirm, der bereits von der initialisiert wurdecurses.wrapper() zu dieser Zeit. Das ist hässlich; auch wenn sie mehr interessante arbeiten wollen, in flüchen und vor dem aufruf derembed_kernel() Funktion, dann kann ich den Text, der von dieser Funktion auf stdout oder stderr gedruckt wurde, nicht sehen.Wie mache ichembed_kernel() Schweigen und zwingen, die Verbindungsdetails über einen anderen Mechanismus zu registrieren? Kann ich ihm meinen eigenen Socket-Namen / Pfad geben?

Ich bin mir sicher, dass ich mir andere Fragen überlegen werde, aber ich hoffe, andere werden diesen Trick nützlich finden und andere Tricks entdecken, die ich verwenden kann, wenn ich mich mit der Python-Curses-Codierung beschäftigen möchte.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage