web-dev-qa-db-fra.com

Comment copier à partir d'une session IPython sans invite de terminal

Fréquemment, mon flux de travail implique le nettoyage/munging de données dans un shell IPython. Cela est devenu particulièrement merveilleux depuis IPython version 5.0 avec tous les grands mises à niveau de l'interface du terminal . Alors, disons que j'essaie de rafraîchir un morceau de données non structurées:

In [11]: for i, (num, header, txt) in enumerate(data):
    ...:     header = [e.strip() for e in header.strip().split('\n')]
    ...:     header[4] = header[4].strip(',').split(',')
    ...:     data[i] = (num, header, txt)
    ...:

Fantastique, ça marche! Mais maintenant, j'aimerais vraiment ajouter ceci à un script dans mon éditeur. Si je copie et colle depuis mon terminal, je capture toutes les ordures sur la gauche. Je peux nettoyer cela plus ou moins facilement dans un éditeur, mais ce serait bien si je pouvais copier le code directement dans mon presse-papiers depuis le terminal sans toucher à la souris et sans saisir les trucs supplémentaires non plus. Existe-t-il une telle fonctionnalité dans IPython?

60
juanpa.arrivillaga

Vous pouvez utiliser le %history magie pour extraire les parties intéressantes de votre session. Ils seront affichés dans le terminal sans aucune indésirable.

Exemple

In [1]: import numpy as np    
In [2]: a = np.random(10)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-83ce219ad17b> in <module>()
----> 1 a = np.random(10)

TypeError: 'module' object is not callable

In [3]: a = np.random.random(10)
In [4]: for i in a:
   ...:     print(i)
   ...:     
0.688626523886
[...]
0.341394850998

Si je veux enregistrer une partie de la session ci-dessus, je peux utiliser:

In [5]: %history 1 3-4

import numpy as np
a = np.random.random(10)
for i in a:
    print(i)

Dans l'exemple ci-dessus, j'ai utilisé %history 1 3-4 pour assembler toutes les commandes que je veux conserver et omettre celles dont je n'ai pas besoin (Ligne 2, celle avec l'erreur). Vous avez maintenant une version de votre session qui peut être joliment copiée.

Écrire un fichier

Vous pouvez également l'écrire directement dans un fichier en utilisant le -f FILENAME comme paramètre.

In [8]: %history 1 3-4 -f /tmp/foo.py

Attention cependant, cela écrasera les fichiers existants . Plus de détails peuvent être trouvés dans la documentation du %history magie .

71
m00am

Donc, j'ai finalement trouvé une excellente solution qui est essentiellement exactement ce que je voulais: utiliser le mode Vi dans IPython. Sur la version 5, cela nécessite:

$ ipython --TerminalInteractiveShell.editing_mode=vi

Maintenant, je peux utiliser le mode visuel vi-like pratique et tirer tout ce dont j'ai besoin!

Ce qui conduit au nouvel alias suivant dans mon .bash_profile/.bash_rc:

alias vpython='ipython --TerminalInteractiveShell.editing_mode=vi'
13

La commande save magic [ documentation ] enregistre les lignes d'entrée que vous voulez dans un fichier; l'option -a est pour le mode "ajout" afin que les lignes soient ajoutées à la fin du fichier au lieu d'écraser le fichier. Je l'utilise tout le temps.

Avec votre exemple:

%save -a myfile.py 11
# the '%' is not necessary
save -a myfile.py 11

Ensuite, vous pouvez continuer à coder dans IPython.

Lorsqu'il y a une autre commande que vous souhaitez écrire dans le même fichier, vous pouvez simplement taper save puis utiliser la flèche vers le haut pour ramener la dernière utilisation de "save" (de sorte que l'option -a et le nom de fichier sont déjà là) et modifiez simplement le numéro de ligne.

Notez que vous pouvez donner plusieurs lignes à enregistrer ainsi que des plages de lignes:

save -a myfile.py 15 18 19-25
10
Cédric Van Rompay

Dans le Shell, vous pouvez d'abord convertir le fichier IPython en un fichier Python (.py) normal, puis faire le nettoyage:

http://ipython.org/ipython-doc/3/notebook/nbconvert.html (voir - au format de script)

Vous pouvez également télécharger le fichier dans l'éditeur de bloc-notes en tant que fichier Python et effectuer le nettoyage après cette étape.

4
Dutch_Programmer

Je ne pense pas que les applications terminales aient vraiment accès au tampon copier/coller. Vous allez devoir utiliser la souris. La procédure dépend du terminal que vous utilisez. La plupart des terminaux modernes ont une sorte de mode "sélection rectangulaire" ou "sélection par bloc".

Sous Windows, la sélection rectangulaire est la valeur par défaut pour cmd.exe et Powershell. Si vous utilisez la menthe de Cygwin, maintenez Alt puis sélectionnez la région avec la souris. Il en va de même pour PuTTY.

Sous Linux (que je n'ai pas devant moi - prenez-les avec un grain de sel), xterm ne le prend pas en charge, Gnome Terminal utilise Ctrl comme modificateur, et Konsole de KDE utilise Ctrl+Alt.

Pour OS X Terminal, Internet me dit que vous utilisez  en cliquant.

D'autres terminaux (et GNU Screen) ont probablement cette fonctionnalité, c'est juste une question de savoir comment l'activer.

1
Sean McSomething