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?
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.
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.
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 .
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'
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
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.
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.