Comment enregistrer une session interactive Python?

416

Je me retrouve fréquemment à utiliser l'interpréteur de Python pour travailler avec des bases de données, des fichiers, etc. - essentiellement beaucoup de formatage manuel de données semi-structurées. Je ne sauvegarde pas et ne nettoie pas correctement les bits utiles aussi souvent que je le voudrais. Existe-t-il un moyen de sauvegarder mes entrées dans le shell (connexions db, affectations de variables, peu de boucles et bits de logique) - un historique de la session interactive? Si j'utilise quelque chose comme scriptj'obtiens trop de bruit standard. Je n'ai pas vraiment besoin de mariner tous les objets - mais s'il y a une solution qui fait ça, ce serait OK. Idéalement, je me retrouverais avec un script qui s'exécutait comme celui que j'avais créé de manière interactive, et je pouvais simplement supprimer les bits dont je n'avais pas besoin. Existe-t-il un package qui fait cela, ou une approche DIY?

MISE À JOUR : Je suis vraiment étonné de la qualité et de l'utilité de ces packages. Pour ceux qui ont des démangeaisons similaires:

  • IPython - aurait dû utiliser cela depuis des lustres, un peu ce que j'avais en tête
  • réinteragir - très impressionnant, je veux en savoir plus sur la visualisation et cela semble y briller. Sorte d'une application de bureau gtk / gnome qui rend les graphiques en ligne. Imaginez une coque hybride + une calculatrice graphique + une mini éclipse. Distribution des sources ici: http://www.reinteract.org/trac/wiki/GettingIt . Construit correctement sur Ubuntu, s'intègre également aux installateurs de bureau gnome, Windows et Mac.
  • bpython - extrêmement cool, beaucoup de fonctionnalités intéressantes, saisie semi-automatique (!), rembobinage, enregistrement d'une touche dans un fichier, indentation, bravo. Distribution de source Python, a tiré quelques dépendances de sourceforge.

Je suis converti, ceux-ci comblent vraiment un besoin entre interprète et éditeur.

démonté
la source

Réponses:

411

IPython est extrêmement utile si vous aimez utiliser des sessions interactives. Par exemple, pour votre cas d'utilisation, il y a la %savecommande magique , vous entrez simplement %save my_useful_session 10-20 23pour enregistrer les lignes d'entrée 10 à 20 et 23 my_useful_session.py(pour vous aider, chaque ligne est préfixée par son numéro).

De plus, la documentation indique:

Cette fonction utilise la même syntaxe que % history pour les plages d'entrée, puis enregistre les lignes dans le nom de fichier que vous spécifiez.

Cela permet par exemple de référencer des sessions plus anciennes, telles que

%save current_session ~0/
%save previous_session ~1/

Regardez les vidéos sur la page de présentation pour obtenir un aperçu rapide des fonctionnalités.

Fourmis Aasma
la source
11
Comment enregistrer toutes les lignes? Sans spécifier la plage, il crée un fichier vide. :(
balki
40
@balki, l'invite d'IPython vous indique le nombre de lignes dans votre historique (ie In[48]). Ainsi save filename 1-48sauverait votre session entière.
Ben Page
2
De plus, est-il possible de recharger ce fichier dans ipython et de garder votre historique d'entrée intact?
Ben Page
15
@BenPage Utilisez "ipython -i [nom de fichier]" sur le fichier .py enregistré, à partir de la commande bash afin de recharger le fichier avant de revenir à une console interactive! (sans l'indicateur -i, vous n'obtenez pas la console interactive après avoir exécuté le fichier).
Samuel Lampa
9
@ user4779, comme on pourrait s'y attendre:%load my_useful_session
Daniel Serodio
167

http://www.andrewhjon.es/save-interactive-python-session-history

import readline
readline.write_history_file('/home/ahj/history')
Roberto Z
la source
10
Crée un fichier vide pour moi sur Windows 7
ubershmekel
10
A fonctionné comme un charme pour moi dans Ubuntu.
Johndt6
4
@ubershmekel - On dirait que cela ne fonctionne que sur Unix
Joel B
28
Échoue sur ma TI-83
Dan
1
N'oubliez pas de le faire à la fin de votre session. Le mien semblait un peu vide après avoir appelé la fonction seulement au début.
dolphus333
95

Il y a moyen de le faire. Stockez le fichier dans ~/.pystartup...

# Add auto-completion and a stored history file of commands to your Python
# interactive interpreter. Requires Python 2.0+, readline. Autocomplete is
# bound to the Esc key by default (you can change it - see readline docs).
#
# Store the file in ~/.pystartup, and set an environment variable to point
# to it:  "export PYTHONSTARTUP=/home/user/.pystartup" in bash.
#
# Note that PYTHONSTARTUP does *not* expand "~", so you have to put in the
# full path to your home directory.

import atexit
import os
import readline
import rlcompleter

historyPath = os.path.expanduser("~/.pyhistory")

def save_history(historyPath=historyPath):
    import readline
    readline.write_history_file(historyPath)

if os.path.exists(historyPath):
    readline.read_history_file(historyPath)

atexit.register(save_history)
del os, atexit, readline, rlcompleter, save_history, historyPath

puis définissez la variable d'environnement PYTHONSTARTUPdans votre shell (par exemple dans ~/.bashrc):

export PYTHONSTARTUP=$HOME/.pystartup

Vous pouvez également l'ajouter pour obtenir la saisie semi-automatique gratuitement:

readline.parse_and_bind('tab: complete')

Veuillez noter que cela ne fonctionnera que sur les systèmes * nix. Comme readline n'est disponible que sur la plate-forme Unix.

Nadia Alramli
la source
Mac OS X utilise editline, donc une fonctionnalité de tabulation complète est disponible, mais la commande exacte est différente: readline.parse_and_bind ("bind ^ I rl_complete")
Miles
C'était rapide, Nadia, merci beaucoup. Je vais essayer les deux réponses - la plate-forme cible est Ubuntu, BTW
non montée le
readline.parse_and_bind('tab: complete')fonctionne si vous utilisez MacPorts Python.
Phillip Cloud
3
Cela devrait être encadré. A travaillé sur RHEL 6.6. Pyenv, 2.7.10.
BilliAm
Pourquoi je n'ai pas cherché ça toutes ces années! Cette solution est excellente car elle utilise un outil original qui est rapide et léger.
iman
75

Si vous utilisez IPython, vous pouvez enregistrer dans un fichier toutes vos commandes précédentes en utilisant la fonction magique % history avec le paramètre -f , pe:

%history -f /tmp/history.py
nachouve
la source
Je n'étais pas sûr de l'emplacement du fichier en utilisant la savemagie. Cela a été très utile
alpha_989
4
Utilisez %history -g -f full_history.pypour obtenir l'historique de toutes les sessions, pas seulement celle en cours. Voir aussi: documentation pour% history .
Evgeni Sergeev
19

Après avoir installé Ipython et ouvert une session Ipython en exécutant la commande:

ipython

à partir de votre ligne de commande, exécutez simplement la commande «magique» Ipython suivante pour enregistrer automatiquement l'intégralité de votre session Ipython:

%logstart

Cela créera un fichier .py au nom unique et stockera votre session pour une utilisation ultérieure en tant que session Ipython interactive ou pour une utilisation dans le (s) script (s) de votre choix.

webappzero
la source
14

De plus, la réinteraction vous donne une interface de type bloc-notes pour une session Python.

Ned Batchelder
la source
4
reinteractest désormais remplacé par le bloc-notes IPython et QtConsole.
Eric O Lebigot
11

En plus d'IPython, un utilitaire similaire bpython a une fonction "enregistrer le code que vous avez entré dans un fichier"

dbr
la source
3
quelqu'un peut-il expliquer comment cela se fait avec bpython? J'ai essayé ctrl + s mais cela n'a pas fonctionné (version 0.14.2 en plus de Python 3.4.3 exécutant le terminal Gnome)
Yibo Yang
Il est lié à F7 par défaut. F1 vous montrera l'aide et les raccourcis clavier actuels.
Jim K.
F7 lance l'éditeur externe. Ctrl + s devrait vous inviter à une simple fonction d'enregistrement dans un fichier, mais il est lié à "s'arrêter" dans bash et zsh, vous devrez donc choisir une alternative dans la configuration bpython.
RCross
8

J'ai eu du mal à trouver une réponse, j'étais très nouveau dans l'environnement iPython.

Cela fonctionnera

Si votre session iPython ressemble à ceci

In [1] : import numpy as np
....
In [135]: counter=collections.Counter(mapusercluster[3])
In [136]: counter
Out[136]: Counter({2: 700, 0: 351, 1: 233})

Vous voulez enregistrer des lignes de 1 à 135 puis sur la même session ipython utilisez cette commande

In [137]: %save test.py 1-135

Cela enregistrera toutes vos instructions python dans le fichier test.py de votre répertoire actuel (où vous avez lancé l'ipython).

Somum
la source
3

Il y a% d'histoire magique pour imprimer et sauvegarder l'historique d'entrée (et éventuellement la sortie).

Pour stocker votre session actuelle dans un fichier nommé my_history.py:

>>> %hist -f my_history.py

Historique IPython stocke à la fois les commandes que vous entrez et les résultats qu'il produit. Vous pouvez facilement parcourir les commandes précédentes avec les touches fléchées haut et bas, ou accéder à votre historique de manière plus sophistiquée.

Vous pouvez utiliser la fonction% history magic pour examiner les entrées et sorties passées. L'historique des entrées des sessions précédentes est enregistré dans une base de données et IPython peut être configuré pour enregistrer l'historique des sorties.

Plusieurs autres fonctions magiques peuvent utiliser votre historique d'entrée, y compris% edit,% rerun,% rappel,% macro,% save et% pastebin. Vous pouvez utiliser un format standard pour faire référence aux lignes:

%pastebin 3 18-20 ~1/1-5

Cela prendra la ligne 3 et les lignes 18 à 20 de la session en cours, et les lignes 1-5 de la session précédente.

Voir% historique? pour le Docstring et plus d'exemples.

Assurez-vous également d'explorer les capacités de % store magic pour une persistance légère des variables dans IPython.

Stocke les variables, les alias et les macros dans la base de données d'IPython.

d = {'a': 1, 'b': 2}
%store d  # stores the variable
del d

%store -r d  # Refresh the variable from IPython's database.
>>> d
{'a': 1, 'b': 2}

Pour restaurer automatiquement les variables stockées au démarrage, spécifiez c.StoreMagic.autorestore = Truedans ipython_config.py.

Alexandre
la source
L'activation de l'enregistrement de l'historique des sorties peut être effectuée en l'activant c.HistoryManager.db_log_outputdans le fichier de configuration.
Ikke
3

Il suffit de mettre une autre suggestion dans le bol: Spyder

entrez la description de l'image ici

Il a un journal d'historique et un explorateur de variables . Si vous avez travaillé avec MatLab, vous verrez les similitudes.

Norfeldt
la source
2

En ce qui concerne Linux, on peut utiliser la scriptcommande pour enregistrer toute la session. Il fait partie du util-linuxpackage et devrait donc être sur la plupart des systèmes Linux. Vous pouvez créer et alias ou fonction qui appellera script -c pythonet qui sera enregistré dans un typescriptfichier. Par exemple, voici une réimpression d'un de ces fichiers.

$ cat typescript                                                                                                      
Script started on Sat 14 May 2016 08:30:08 AM MDT
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print 'Hello Pythonic World'
Hello Pythonic World
>>> 

Script done on Sat 14 May 2016 08:30:42 AM MDT

Le petit inconvénient ici est que scripttout enregistre, même les sauts de ligne, chaque fois que vous appuyez sur les espaces arrière, etc. Donc, vous voudrez peut-être utiliser colpour nettoyer la sortie (voir cet article sur Unix et Linux Stackexchange ).

Sergiy Kolodyazhnyy
la source
2

La %historycommande est géniale, mais malheureusement, elle ne vous permettra pas d'enregistrer des éléments qui étaient% coller dans la session. Pour ce faire, je pense que vous devez faire %logstart au début (même si je n'ai pas confirmé que cela fonctionne).

Ce que j'aime faire c'est

%history -o -n -p -f filename.txt

qui enregistrera la sortie, les numéros de ligne et «>>>» avant chaque entrée (options o, n et p). Voir les documents pour% history ici .

mots dans le sens
la source
1

il y a une autre option --- pyslice. dans les "démos et outils de docs de wxpython 2.8", il y a un programme open source nommé "pyslices".

vous pouvez l'utiliser comme un éditeur, et il prend également en charge l'utilisation comme une console ---- exécutant chaque ligne comme un interpréteur interactif avec écho immédiat.

bien sûr, tous les blocs de codes et les résultats de chaque bloc seront automatiquement enregistrés dans un fichier txt.

les résultats sont enregistrés juste derrière le bloc de code correspondant. très pratique.

la vue d'ensemble des pyslices

fandyst
la source
Auteur de PySlices ici. Heureux que vous aimiez PySlices (et que vous l'avez même trouvé). Ce n'est pas encore tout à fait un abandon (je l'utilise toujours), mais la version incluse dans wxPython elle-même ne fonctionne souvent pas bien. Si vous souhaitez suivre les mises à jour, vous pouvez les obtenir à partir du package wx_py : pypi.python.org/pypi/wx_py , github.com/davidmashburn/wx_py
David
1

Si vous utilisez bpython , tout l'historique de vos commandes est par défaut enregistré dans ~/.pythonhist.

Pour enregistrer les commandes pour une réutilisation ultérieure, vous pouvez les copier dans un fichier de script python:

$ cp ~/.pythonhist mycommands.py

Modifiez ensuite ce fichier pour le nettoyer et placez-le sous le chemin Python (packages de site de l'environnement global ou virtuel, répertoire actuel, mention dans * .pth, ou d'une autre manière).

Pour inclure les commandes dans votre shell, importez-les simplement à partir du fichier enregistré:

>>> from mycommands import *
Aidas Bendoraitis
la source
sauveur de vie. une réponse difficile à trouver
Mehdi LAMRANI
0

Certains commentaires demandaient comment enregistrer toutes les entrées IPython à la fois. Pour% save magic dans IPython, vous pouvez enregistrer toutes les commandes par programme comme indiqué ci-dessous, pour éviter le message d'invite et également pour éviter de spécifier les numéros d'entrée. currentLine = len (In) -1% save -f my_session 1- $ currentLine

L' -foption est utilisée pour forcer le remplacement de fichiers et len(IN)-1affiche l'invite de saisie actuelle dans IPython, vous permettant d'enregistrer la session entière par programme.

EF Haghish
la source
0

Pour ceux qui utilisent spacemacs, et ipythonqui vient avec python-layer, la magie de sauvegarde crée beaucoup de sorties indésirables, en raison de la commande de complétion automatique constante qui fonctionne dans le backround, comme:

len(all_suffixes)
';'.join(__PYTHON_EL_get_completions('''len'''))
';'.join(__PYTHON_EL_get_completions('''all_substa'''))
len(all_substantives_w_suffixes)
';'.join(__PYTHON_EL_get_completions('''len'''))
';'.join(__PYTHON_EL_get_completions('''all'''))
';'.join(__PYTHON_EL_get_completions('''all_'''))
';'.join(__PYTHON_EL_get_completions('''all_w'''))
';'.join(__PYTHON_EL_get_completions('''all_wo'''))
';'.join(__PYTHON_EL_get_completions('''all_wor'''))
';'.join(__PYTHON_EL_get_completions('''all_word'''))
';'.join(__PYTHON_EL_get_completions('''all_words'''))
len(all_words_w_logograms)
len(all_verbs)

Pour éviter cela, enregistrez simplement le tampon ipython comme vous en enregistrez normalement un autre: spc f s

Kaan E.
la source
0

Je voudrais suggérer une autre façon de maintenir la session python via tmux sur linux. vous exécutez tmux, attachez-vous à la session que vous avez ouverte (s'il n'est pas attaché après l'avoir ouvert directement). exécutez python et faites ce que vous faites dessus. puis détachez-vous de la session. le détachement d'une session tmux ne ferme pas la session. la session reste ouverte.

avantages de cette méthode: vous pouvez vous attacher à cette session à partir de n'importe quel autre appareil (au cas où vous pouvez ssh votre PC)

inconvénients de cette méthode: cette méthode ne renonce pas aux ressources utilisées par la session python ouverte jusqu'à ce que vous existiez réellement l'interpréteur python.

Myonaiz
la source
0

Pour enregistrer l'entrée et la sortie sur XUbuntu :

  1. Dans XWindows, exécutez iPython à partir de l'application de terminal Xfce
  2. cliquez Terminaldans la barre de menu supérieure et recherchez save contentsdans la liste déroulante

Je trouve que cela enregistre l'entrée et la sortie, remontant jusqu'à quand j'ai ouvert le terminal. Ce n'est pas spécifique à ipython et fonctionnerait avec des sessions ssh ou d'autres tâches exécutées à partir de la fenêtre du terminal.

Paul
la source