Wie funktioniert IPythons magische% -Paste?

93

Ich möchte bereits eingerückten Python-Code / ganze Funktionen und Klassen in IPython kopieren. Jedes Mal, wenn ich es versuche, wird die Einrückung durcheinander gebracht und ich erhalte die folgende Fehlermeldung:

IndentationError: unindent does not match any outer indentation level (<ipython-input-23-354f8c8be51b>, line 12)

If you want to paste code into IPython, try the %paste and %cpaste magic functions.

Framester
quelle
3
Ich weiß, es ist wahrscheinlich bereits im Stackoverflow, aber es wurde nach 3 Suchen nicht gefunden, also habe ich meine eigene Version hinzugefügt.
Framester

Antworten:

136

Sie können nicht direkt nach IPython kopieren. Dies sind die Schritte:

  1. Kopieren Sie die Zeilen, die Sie in IPython kopieren möchten, in die Zwischenablage
  2. Geben Sie %pasteIPython ein
  3. Drücken Sie Enter
  4. Profitieren!
Framester
quelle
47
% Paste erfordert Tkinter, also wenn Sie nicht haben, dass eine andere gute Wette% cpaste ist
yekta
61
Sie können Code tatsächlich direkt nach IPython kopieren: Möglicherweise müssen Sie zuerst die automatische Einrückung durch Eingabe deaktivieren %autoindent.
Eric O Lebigot
Danke EOL! +1 für Sie
Framester
5
In können Ipython 5 Sie einfach den Code einfügen. Ich brauche nicht %pastemehr. Lesen Sie diese Antwort .
Levon
1
Sie brauchen das% vorher auch pastenicht.
Worte für den
40

Eine Klarstellung der Schritte:

  • Kopieren Sie zunächst die Zielzeilen in Ihre Zwischenablage.

  • Geben Sie in die iPython-Eingabeaufforderung Folgendes ein:

    • Wenn auf Tkinter: eingeben %paste
    • Ansonsten: eingeben %cpaste
  • Einfügen (Strg-V) und drücken Sie die Eingabetaste.

  • Geben Sie dann ein --und drücken Sie die Eingabetaste.

Beispielsweise:

In [1]: %cpaste
Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
:for l in "Hello World":
:    print l,
:--
H e l l o   W o r l d
Yuly
quelle
3
Sie müssen nicht Strg-V drücken. Geben Sie nur% paste ein und drücken Sie die Eingabetaste.
SeF
21

Ab Ipython 5 benötigen Sie keinen magischen Befehl, fügen Sie ihn einfach ein

ipython5

Dank prompt_toolkit, IPythonunterstützt jetzt:

  • Syntaxhervorhebung während der Eingabe
  • Echte mehrzeilige Bearbeitung (Aufwärts- und Abwärtspfeiltasten bewegen sich zwischen den Zeilen)
  • Mehrzeiliges Einfügen, ohne die Einrückung zu unterbrechen oder Code sofort auszuführen
  • Bessere Code-Vervollständigungsschnittstelle (wir planen, diese weiter zu verbessern) Optionale Mausunterstützung

Mehr dazu hier

So aktualisieren Sie ipythonauf die neueste Version

pip install ipython --upgrade 
Levon
quelle
Ist es möglich, mehrere Zeilen einzufügen und den Code automatisch in jeder Zeile auszuführen?
Eric Duminil
Ja, fügen Sie einfach den Code ein und drücken Sie die Eingabetaste. Wenn Sie debuggen möchten, überprüfen Sie% pdb oder ipdb. Beispiel
Levon
Dies unterstützt auch die Ausgabe des Python-Repl-Codes, der mit drei >Zeichen wie diesem beginnt :>>> a = 1 + 2
Flimm
Die ganze Zeit habe ich% cpaste gemacht .. nett!
Gershon Herczeg
1
Ich denke, es hängt von der Umgebung ab, aus der Sie das Einfügen durchführen und wie Sie das Einfügen durchführen. Mein Kollege verwendet die Windows 10-Eingabeaufforderung für SSH in unserem Linux-Host, öffnet dort ipython in einem Docker-Container und versucht, bereits eingerückten Code einzufügen (durch Klicken mit der rechten Maustaste ), und er erhält sogar in iPython 7.8.0 zusätzliche Einrückungen. Ich verstehe das Rechtsklickverhalten der Eingabeaufforderung so, dass sie tatsächlich nur das nimmt, was sich in der Zwischenablage befindet, und es Zeichen für Zeichen ausgibt, als ob Sie es eingeben. IPython kann also nicht erkennen, dass Sie tatsächlich einfügen.
Kal
6

%paste erfordert Tkinter. Wenn Sie in Ubuntu sind, können Sie es von installieren

sudo apt-get install python-tk

Wenn Sie auf Python3 sind

sudo apt-get install python3-tk

Starten Sie dann ipython neu und verwenden Sie es, %pasteum es aus Ihrer Zwischenablage einzufügen .

ChillarAnand
quelle
1

Eine der nützlichen Antworten ging in den Kommentaren verloren, daher wollte ich sie wiederholen und eine Referenz für eine andere nützliche IPython-Zauberfunktion hinzufügen.

Um das zu wiederholen, was @EOL gesagt hat, besteht eine Möglichkeit, das Problem von OP zu lösen, darin, die automatische Einrückung zu deaktivieren, indem Sie zuerst das Einfügen ausführen und ausführen %autoindent(dies wird %pastenatürlich nicht benötigt, wenn Sie es verwenden ).

Um weitere Informationen zu den bereits vorhandenen Informationen hinzuzufügen %doctest_mode, können Sie in IPython einen weiteren nützlichen Modus kopieren, um Beispiele einzufügen und Snippets aus Dokumentzeichenfolgen zu testen. Dies ist auch nützlich, um interaktive Python-Sitzungsausgaben auszuführen, die Sie in der Dokumentation und in Online-Foren finden, ohne zuerst die Eingabeaufforderungszeichenfolgen entfernen zu müssen.

haridsv
quelle
1

Für Ubuntu-Benutzer, die Python 3 verwenden.

Das python-tkist für Python 2.

%pasteInstallieren Sie das python3-tkPaket , um mit Python 3 arbeiten zu können :

sudo apt-get install python3-tk
utapyngo
quelle