Ipython: Initiieren Sie die mehrzeilige Eingabe im Terminal ipython und in der ipython-Konsole

Erstellt am 15. Okt. 2012  ·  14Kommentare  ·  Quelle: ipython/ipython

In qtconsole (über ctrl-enter ) und im Notizbuch (nur über enter innerhalb einer Zelle) können Sie jede einzeilige Eingabe in eine mehrzeilige Eingabe umwandeln. Es wäre schön, so etwas für die Terminal- und Konsolen-Einstiegspunkte zum Laufen zu bringen.

Derzeit besteht eine mögliche Problemumgehung darin, und if 1: für die erste Eingabezeile zu verwenden, wodurch dann die mehrzeilige Eingabe in allen Clients initiiert wird, aber das scheint etwas umständlich zu sein.

Im Allgemeinen halte ich es für sinnvoll, wenn möglich, eine Funktionsparität zwischen den verschiedenen Clients zu haben.

Konkretes Beispiel: Ich kann mit der qtconsole folgende Eingabe machen, indem ich am Ende jeder Zeile ctrl-enter drücke:

In [2]: print "hello"
   ...: print "this is all one input"
   ...: print "same here..."
   ...: 

und wenn ich diese Zeile ausführe und dann einen terminalbasierten Ipython-Client starte und den Aufwärtspfeil drücke, sehe ich eine entsprechende Eingabeaufforderung:

In [1]: print "hello"
print "this is all one input"
print "same here..."

die ausgeführt und ausgeführt werden kann, aber es gibt keine Möglichkeit, eine mehrzeilige Freiformeingabe wie die vom Terminal aus einzugeben, was zu einem umständlichen Arbeitsablauf führt.

danke an @michaelpacer , der mich darauf aufmerksam gemacht hat.

Hilfreichster Kommentar

Das Drücken ctrl+o funktioniert bei mir (versucht in cmd- und conemu-Konsolen).

Es kann auch ( verwendet werden

 In [84]: (
     ...: fig, ax = plt.subplots(1,2)
     ...: ax[0].plot([1,2,3])
     ...: ax[1].plot([3,2,1])
     ...: fig.show()
     ...:

Wenn Sie mit der Eingabe fertig sind, kehren Sie einfach zur ersten Zeile zurück und entfernen Sie das ( .

Alle 14 Kommentare

Ich denke, wir stoßen hier auf die Einschränkungen des Terminals/der Readline. Soweit ich weiß, gibt es keine einfache Möglichkeit, Strg-Eingabe zu erkennen. Wir rufen einfach raw_input() und bekommen einen String zurückgegeben – oder eine Ausnahme, die ausgelöst wird, wenn der Benutzer Strg-D oder Strg-C drückt.

Als längerfristiges Projekt könnte dies durch die Verwendung einer Bibliothek wie pyrepl anstelle von readline möglich sein. Das interessiert uns schon seit einiger Zeit, aber niemand ist dazu gekommen, es genauer zu untersuchen. Eine andere Möglichkeit wäre, ein neues Frontend mit Curses oder einem ähnlichen Tool wie urwid zu erstellen.

Eine Sache, die Sie tun können, ist Strg-V, Strg-J zu drücken, um einen Zeilenumbruch einzugeben, ohne die Eingabe auszuführen. Ich denke, dies ist Teil von Bash selbst, da es auch auf dem Terminal funktioniert (Strg-v sagt, dass der nächste Hotkey als Steuersequenz behandelt werden soll, und Strg-j ist Zeilenumbruch). Ich hatte keine Gelegenheit, mich mit iTerm2 herumzuschlagen, aber vielleicht ist es möglich, Strg-Eingabe irgendwie dieser Doppelsequenz zuzuordnen?

Bearbeiten: Sie können dies tatsächlich zumindest in iTerm2 replizieren. Kann zu Ihren globalen Tastenkombinationen gehen und Strg-Enter auf "Hex-Codes senden" und dann: 0x16 0x0a setzen

Wäre es vielleicht möglich, diese Art von Funktionalität jetzt mit prompt_toolkit zu bekommen?

Ja, allerdings nicht mit einem Enter-Shortcut - es scheint, dass die einzige Kombination mit Enter, die wir mit Enter erkennen können, Alt-Enter (oder Esc, Enter ) ist, und wir verwenden das bereits für die erzwungene Ausführung (dh keinen Zeilenumbruch hinzufügen). Wir könnten dies jedoch mit einem anderen Kurzbefehl tun – oder Sie könnten einen benutzerdefinierten Kurzbefehl hinzufügen.

Eine Möglichkeit, dies im aktuellen IPython zu tun, besteht darin, F2 zu drücken, wodurch Sie in einen Editor gelangen und den Inhalt in Ihre Eingabe einfügen, wenn Sie fertig sind. Sie können steuern, welcher Editor geöffnet wird, indem Sie die Umgebungsvariable $EDITOR setzen.

Alt-Enter unter Windows ändert ipython-Fenster in den Vollbildmodus.

Wenn Sie das neueste ipython und prompt_toolkit verwenden und vi-mode aktiviert haben, können Sie Ihren Befehl eingeben, dann ESC drücken und dann o drücken. Dadurch wird eine neue Zeile erstellt, genau wie in vi.

Auf diese Weise können Sie mehrzeilige Befehle haben.

In [29] : %reset -s #----> press `ESC` then `o`
            %run foo.py

Ref

  1. Aktivieren des Vi-Modus in Ipython: http://koo.fi/blog/2016/08/04/enable-vi-editing-mode-in-ipython-5/

Bin gerade darauf gestoßen. Ich bin positiv Strg-Enter verwendet, um eine neue Zeile zu erstellen!?! Aber dieses Problem würde darauf hindeuten, dass ich mich irre :(

Eine weitere Möglichkeit besteht darin, das Semikolon als Zeilentrenner zu interpretieren. z.B

%run slow_script.py; !display_notification.sh

wird mein Python-Skript ausführen und dann ein Bash-Skript ausführen.

Edit : Das funktioniert nicht wirklich, es ist nur ein Vorschlag

Ich mache es mit ;

cv2.imshow('Bild', im) ;
cv2.waitKey(0) ;
cv2.destroyAllWindows()

Das Drücken ctrl+o funktioniert bei mir (versucht in cmd- und conemu-Konsolen).

Es kann auch ( verwendet werden

 In [84]: (
     ...: fig, ax = plt.subplots(1,2)
     ...: ax[0].plot([1,2,3])
     ...: ax[1].plot([3,2,1])
     ...: fig.show()
     ...:

Wenn Sie mit der Eingabe fertig sind, kehren Sie einfach zur ersten Zeile zurück und entfernen Sie das ( .

Ich mache es mit ;

cv2.imshow('Bild', im) ;
cv2.waitKey(0) ;
cv2.destroyAllWindows()

Es scheint nicht so, als könnten Sie Python und Magie auf diese Weise mischen:

In [5]: %run test.py ;\
   ...: !echo foo

hi

Das Drücken von Strg + O funktioniert bei mir (versucht in cmd- und conemu-Konsolen).

Für mich ist es alt+o .

Bei mir ist es Strg+O

Strg+o funktioniert bei mir in ipython , aber nicht in jupyter console .

Strg+O funktioniert, dieses Problem kann geschlossen werden

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen