Seltsame Shell-Ausgabe bei Verwendung von IPython 5

37

Ich habe gerade ein Upgrade auf die neueste Version von IPython durchgeführt und jetzt stimmt etwas nicht, wenn ich es in Emacs verwende.

Wenn es in einem regelmäßigen Terminal funktioniert es gut (Farben, Tabula Fertigstellung, etc.), jedoch entweder in M-x eshelloder M-x shellanstelle von outputing In [1]:, es tatsächlich Ausgängen [?12l[?25hund Out[1]Ausgänge [J[?7h[?12l[?25h[?2004l[?7hOut[1]:.

Vielleicht ist es eine Funktion des Terminals, die auf von IPython verwendeten Emacs nicht verfügbar ist, aber ich würde gerne wissen, um welche es sich handelt.

Terminal.app:

In [1]: 2+2
Out[1]: 4

Emacs

[?12l[?25h2+2
[J[?7h[?12l[?25h[?2004l[?7hOut[1]: 4
Wörtlich
quelle
Hast du einen Fehler im Upstream geöffnet? Ich konnte nichts finden, aber es ist auch ein bisschen schwierig, Geldautomaten zu suchen, wenn Gmane überarbeitet wird.
Rasmus
2
Als Referenz ist der Upstream-Bug # 25306
npostavs

Antworten:

41

IPython 5 verfügt über eine neue Terminalschnittstelle, die nicht mit den untergeordneten Emacs-Shells kompatibel ist. Fügen Sie --simple-promptdem IPython-Befehl das Flag hinzu, um das Problem zu beheben :

(setq python-shell-interpreter "ipython"
    python-shell-interpreter-args "--simple-prompt -i")

Aus der Dokumentation:

Die neue Schnittstelle ist nicht mit der Emacs-Funktion "inferior-shell" kompatibel. Fügen Sie das --simple-promptFlag zu dem Befehl hinzu, den Emacs ausführt , um dieses weiterhin zu verwenden . Dieses Flag deaktiviert die meisten IPython-Funktionen und verlässt sich auf Emacs, um beispielsweise das Ausfüllen von Registerkarten zu ermöglichen.

Referenz: http://ipython.readthedocs.io/en/stable/whatsnew/version5.html#id1

Ricardo Lima
quelle
6
Ja, das habe ich zuerst getan, aber der Mangel an mehrzeiliger Unterstützung (am wichtigsten für Funktionsdefinitionen) hat mich dazu veranlasst, zu ipython 4 zurückzukehren. Es sollte jedoch beachtet werden, dass ipython 5 gut mit Mx term zusammenarbeitet.
Literal
3
Das Setzen dieses Flags ist bei Elpy jedoch immer noch sehr nützlich - über die Variable python-shell-interpreter-args. Wenn Sie Elpy noch nicht ausprobiert haben, sollten Sie es ausprobieren. Damit können Sie Ihre Funktionsdefinitionen in einen separaten Puffer schreiben und mit nur einem Befehl an den Interpreter übergeben. In diesem Fall können Sie alle Bearbeitungsbefehle von Emacs nutzen und eine interaktive Sitzung abrufen - das Beste aus beiden Welten.
Ricardo Lima
1
@Literal der Grund , warum auch auf den Link geschrieben: sie verändert verwenden readlinezu prompt_toolkitauf IPython 5. prompt_toolkitist nicht kompatibel mit Emacs Schalen, die aus unterschiedlich arbeiten term: soweit ich weiß, Muscheln dumme Terminals mit dem Zweck der Arbeits mehr laufen wie ein Standard-Emacs-Puffer, während termein tatsächlicher voller Terminal-Emulator ausgeführt wird. Es scheint, dass Shells mit kompatibel sind, readlineaber nicht mit prompt_toolkit, was die Eingabeaufforderung erklären würde, die die Escape-Sequenzen zeigt. Da termein vollständiges Terminal ausgeführt wird, werden die Escape-Sequenzen korrekt interpretiert.
Ricardo Lima
1
Ich habe es nicht akzeptiert, weil ich die anderen Funktionen gerne beibehalten hätte, vielleicht mit einem anderen Shell-Modus mit mehr Funktionen. Aber ich denke, ich muss damit leben.
Buchstäblich
1
@CodyChan Es deaktiviert IPython auf die UI - Funktionen beziehen, wie Abschluss, Farben, etc. Es hält die Dinge wie% Magie Befehle, Eingabe / Ausgabe - Geschichte, Shell - Befehle, Hilfebefehle, etc.!?
jpkotta
0

Es gibt eine Möglichkeit, IPython in der Emacs-Shell zu öffnen, ohne --simple-prompt zu verwenden

1. pip install rlipython

2. Open IPython in terminal

3. Run import rlipython; rlipython.install() 

Danach sollten Sie in der Lage sein, ipython direkt in der Emacs-Shell zu öffnen, ohne dass das Anzeigeproblem auftritt.

In meinem Fall gibt es jedoch noch ein weiteres Problem: Aus irgendeinem Grund konnte ich einige mehrzeilige Klassendefinitionen, auch nachdem die Anzeige korrekt war, nicht direkt in ipython in der Emacs-Shell kopieren und einfügen. Meine derzeitige Lösung besteht darin, den Befehl Ipython% paste zu verwenden. Wenn Sie bessere Ansätze haben, lassen Sie es mich bitte wissen.

PS: Ich benutze Ubuntu 16.04. Jemand, der MacOS verwendet, sagt, dass es IPython bricht.

DataHungry
quelle
Bildnachweis
DataHungry
Es beschädigt die IPython-Installation
Diogo
Auf welche Weise? Es funktioniert gut für mich
DataHungry
Es bricht IPython auf MacOS, github.com/ludwigschwardt/python-gnureadline/issues/50
Alvin