Comment fonctionne le% paste magique d'IPython?

93

Je souhaite copier du code Python / des fonctions entières et des classes déjà en retrait dans IPython. Chaque fois que j'essaye, l'indentation est foutue et j'obtiens le message d'erreur suivant:

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
la source
3
Je sais, il est probablement déjà sur stackoverflow, mais il ne l'a pas trouvé après 3 recherches, j'ai donc ajouté ma propre version.
Framester

Réponses:

136

Vous ne pouvez pas copier directement sur IPython. Voici les étapes:

  1. Copiez les lignes que vous souhaitez copier dans IPython dans le presse-papiers
  2. Entrez %pastedans IPython
  3. Appuyez sur Entrée
  4. Profit!
Framester
la source
47
% paste nécessite cependant Tkinter, donc si vous ne l'avez pas, un autre bon pari est% cpaste
yekta
61
Vous pouvez en fait copier le code directement sur IPython: vous devrez peut-être d'abord désactiver l'indentation automatique en entrant %autoindent.
Eric O Lebigot
Merci EOL! +1 pour vous
Framester
5
Dans Ipython 5 vous pouvez simplement coller le code. Plus besoin %paste. Lisez cette réponse .
Levon
1
Vous n'avez pas non plus besoin du% avant paste.
wordsforthewise
40

Une clarification sur les étapes:

  • Tout d'abord, copiez les lignes cibles dans votre presse-papiers.

  • Tapez dans l'invite iPython:

    • Si sur Tkinter: entrez %paste
    • Sinon: entrez %cpaste
  • Collez (Ctrl-V) et appuyez sur Entrée.

  • Puis tapez --et appuyez sur Entrée.

Par exemple:

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
la source
3
Vous n'êtes pas obligé de Ctrl-V. Tapez uniquement% paste et appuyez sur Entrée.
SeF
21

Depuis Ipython 5, vous n'avez besoin d'aucune commande magique, collez-la simplement

ipython5

Merci à prompt_toolkit, IPythonprend désormais en charge:

  • Mise en évidence de la syntaxe à mesure que vous tapez
  • Édition multi-lignes réelle (les touches fléchées haut et bas se déplacent entre les lignes)
  • Collage multiligne sans rompre l'indentation ni exécuter immédiatement le code
  • Meilleure interface de complétion de code (nous prévoyons de l'améliorer davantage) Prise en charge de la souris en option

Plus à ce sujet ici

Pour mettre ipythonà niveau vers la dernière version

pip install ipython --upgrade 
Levon
la source
Est-il possible de coller plusieurs lignes et d'exécuter le code automatiquement à chaque ligne?
Eric Duminil
oui, collez simplement le code et appuyez sur Entrée. si vous voulez déboguer, vérifiez% pdb ou ipdb. exemple
Levon
Cela prend également en charge la sortie du code Python repl, qui commence par trois >signes comme celui-ci:>>> a = 1 + 2
Flimm
Pendant tout ce temps, j'ai fait% cpaste .. sympa!
Gershon Herczeg
1
Je pense que cela dépend de l' environnement à partir duquel vous faites le collage et de la façon dont vous faites le collage? Mon collègue utilise l'invite de commande de Windows 10 pour SSH dans notre hôte Linux, ouvre ipython dans un conteneur Docker et essaie de coller du code déjà mis en retrait (en cliquant avec le bouton droit ), et il obtient une indentation supplémentaire même dans iPython 7.8.0. La façon dont je comprends le comportement du clic droit de l'invite de commande est qu'il prend en fait tout ce qui se trouve dans le presse-papiers et le sort caractère par caractère comme si vous le tapiez. IPython n'a donc aucun moyen de savoir que vous êtes en train de coller.
Kal
6

%paste exige Tkinter. Si vous êtes dans ubuntu, vous pouvez l'installer en

sudo apt-get install python-tk

Si vous êtes sur Python3

sudo apt-get install python3-tk

Ensuite, redémarrez ipython et utilisez %pastepour coller à partir de votre presse-papiers.

ChillarAnand
la source
1

L'une des réponses utiles a été perdue dans les commentaires, je voulais donc la reformuler en ajoutant une référence pour une autre fonction magique IPython utile.

Tout d'abord, pour reformuler ce que @EOL a dit, une façon de résoudre le problème d'OP est de désactiver l'indentation automatique en exécutant d'abord %autoindentet en faisant le collage (pas nécessaire si vous utilisez %paste, bien sûr).

Maintenant, pour ajouter plus d'informations à ce qui est déjà là, un autre mode utile dans IPython est %doctest_modequi vous permet de copier des exemples de collage et de tester des extraits de chaînes doc. Ceci est également utile pour exécuter la sortie de session Python interactive que vous pourriez trouver dans la documentation et les forums en ligne, sans avoir à supprimer d'abord les chaînes d'invite.

haridsv
la source
1

Pour les utilisateurs ubuntu qui utilisent Python 3.

Le python-tkest pour Python 2.

Pour %pastetravailler sur Python 3, installez le python3-tkpackage:

sudo apt-get install python3-tk
utapyngo
la source