Comment sauvegarder une session interactive en Python?

je me retrouve souvent à 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 n'enregistre pas et ne nettoie pas les bits utiles aussi souvent que je le voudrais. Y a-t-il un moyen de sauvegarder mes entrées dans le shell (connexions db, affectations variables, peu de boucles et de bits de logique) -- un peu d'histoire de la session interactive? Si j'utilise quelque chose comme script j'obtiens trop de bruit stdout. Je n'ai pas vraiment besoin de ramasser tous les objets -- bien que s'il ya une solution qui fait cela, il serait OK. Idéalement, il me resterait juste un script qui fonctionnerait comme celui que j'ai créé de façon interactive, et je pourrais simplement supprimer les bits dont je n'avais pas besoin. Y a-t-il un paquet qui fait cela, ou une approche de bricolage?

UPDATE : je suis vraiment étonné de la qualité et de l'utilité de ces paquets. Pour ceux qui ont une démangeaison similaire:

  • IPython -- j'aurais dû l'utiliser depuis des lustres, un peu ce que j'avais en tête
  • reinteract -- très impressionnant, je veux en savoir plus sur la visualisation et cela semble comme il brillera là. Une sorte d'application de bureau gtk/gnome qui rend les graphiques en ligne. Imaginez un shell hybride + calculatrice graphique + mini éclipse. Source distribution ici: http://www.reinteract.org/trac/wiki/GettingIt . Construit sur Ubuntu, s'intègre dans bureau gnome, Windows et Mac installateurs aussi.
  • bpython -- très cool, beaucoup de fonctionnalités intéressantes, la saisie semi-automatique(!), retour en arrière, une frappe enregistrer le fichier, l'indentation, bien fait. Python source distribution, a tiré quelques dépendances de sourceforge.

je suis converti, ceux-ci remplissent vraiment un besoin entre l'interprète et l'éditeur.

358
demandé sur Community 2009-06-04 03:21:02

17 réponses

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

en outre, la documentation stipule:

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

cela permet, par exemple, de faire référence à 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.

336
répondu Ants Aasma 2017-06-20 18:14:30

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

import readline
readline.write_history_file('/home/ahj/history')
128
répondu Roberto Z 2012-03-15 13:06:35

Il y a un chemin de le faire. Conservez 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

et ensuite définir la variable d'environnement PYTHONSTARTUP dans votre shell (par exemple dans ~/.bashrc ):

export PYTHONSTARTUP=$HOME/.pystartup

vous pouvez aussi ajouter ceci pour obtenir autocomplete 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.

84
répondu Nadia Alramli 2014-12-01 13:04:09

si vous utilisez IPython vous pouvez sauvegarder dans un fichier toutes vos commandes précédentes en utilisant la fonction magique %history avec le paramètre - f , p. e:

%history -f /tmp/history.py
54
répondu nachouve 2015-04-30 17:56:37

après l'installation de Ipython , et l'ouverture D'une session Ipython en exécutant la commande:

ipython

à partir de votre ligne de commande, exécutez simplement la commande 'magic' Ipython suivante pour enregistrer automatiquement votre session Ipython entière:

%logstart

cela créera un nom unique.PY fichier et stocker votre session pour une utilisation ultérieure comme une session interactive Ipython ou pour une utilisation dans le(S) script (s) de votre choix.

15
répondu webappzero 2014-10-30 21:12:47

aussi, reinteract vous donne une interface de type notebook vers une session Python.

13
répondu Ned Batchelder 2009-06-04 00:28:21

en plus de IPython, un utilitaire similaire bpython a un "Enregistrer le code que vous avez entré dans un fichier "caractéristique

11
répondu dbr 2013-09-21 22:49:39

j'ai dû lutter pour trouver une réponse, j'étais très nouveau à iPython environnement.

Cela fonctionne

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 sauver des lignes de 1 à 135 puis sur la même session ipython utilisez cette commande

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

cela sauvegardera toutes vos instructions python dans test.py fichier dans votre répertoire courant (où vous avez initié l'ipython).

6
répondu Somum 2014-08-22 12:47:02

il y a %history magic pour imprimer et sauvegarder l'historique des entrées (et éventuellement la sortie).

pour stocker votre session courante dans un fichier nommé my_history.py :

>>> %hist -f my_history.py

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

vous pouvez utiliser le %histoire fonction magique pour examiner les entrées et les 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 pouvez utiliser votre historique des entrées, y compris %modifier, %relancé, %rappel, %macro, %enregistrer et %pastebin. Vous pouvez utiliser un format standard pour renvoyer aux lignes:

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

il s'agit de la ligne 3 et des lignes 18 à 20 de la session en cours, et des lignes 1 à 5 de la session en cours. la session précédente.

Voir %l'histoire? pour la Docstring, et d'autres exemples.

aussi, assurez-vous d'explorer les capacités de %Magic store pour la persistance légère des variables en IPython.

stocke des variables, des Alias et des 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 autoriser les variables stockées au démarrage, spécifiez c.StoreMagic.autorestore = True dans ipython_config.py.

3
répondu Alexander 2016-02-06 03:48:30

je mets juste une autre suggestion dans le bol: Spyder

enter image description here

Il a journal de l'Historique et "1519110920 Variable" explorer . Si vous avez travaillé avec MatLab, alors vous verrez les similitudes.

3
répondu Norfeldt 2016-02-23 06:45:33

en ce qui concerne Linux, on peut utiliser la commande script pour enregistrer toute la session. Il fait partie du paquet util-linux donc devrait être sur la plupart des systèmes Linux . Vous pouvez créer et alias ou fonction qui appellera script -c python et qui sera sauvegardé dans un fichier typescript . Par exemple, voici une réédition d'un tel fichier.

$ 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

petit inconvénient ici est que le script enregistre tout, même les flux de ligne, chaque fois que vous frappez des espaces arrière , etc. Vous pouvez donc utiliser col pour nettoyer la sortie (voir ce post sur Unix&Linux Stackexchange ).

2
répondu Sergiy Kolodyazhnyy 2017-04-13 12:36:28

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

vous pouvez l'utiliser comme un éditeur, et il supporte aussi 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 sera enregistré dans un fichier txt automatiquement.

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

the overview of pyslices

1
répondu fandyst 2013-06-26 16:03:33

la commande %history est impressionnante, mais malheureusement elle ne vous permettra pas de sauver des choses qui étaient %paste 'D dans le sesh. Pour ce faire, je pense que vous devez faire %logstart au début (bien que je n'ai pas confirmé cela fonctionne).

ce que j'aime faire est

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

qui sauvegardera la sortie, les numéros de ligne et "> > > " avant chaque entrée (options o, n et p). Voir la documentation pour % histoire ici .

1
répondu wordsforthewise 2017-05-23 12:26:38

certains commentaires demandaient comment sauvegarder toutes les entrées IPython en une seule fois. Pour %save magic dans IPython, vous pouvez enregistrer toutes les commandes de manière programmée comme indiqué ci-dessous, pour éviter le message d'invite et aussi pour éviter de spécifier les numéros d'entrée. currentLine = len () -1 % save-f my_session 1 - $ currentLine

l'option -f est utilisée pour forcer le remplacement de fichier et le len(IN)-1 montre l'invite d'entrée courante dans IPython, vous permettant de enregistrez toute la session par programmation.

0
répondu E. F. Haghish 2016-07-26 16:11:17

pour ceux qui utilisent spacemacs , et ipython qui vient avec python-layer , save magic crée beaucoup de sortie non désirée, en raison de la constante auto-completion commande de travail dans le backround tels que:

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, sauvez simplement le tampon ipython comme vous sauvez normalement n'importe quel autre: spc f s

0
répondu Kaan E. 2016-12-23 16:09:11

si vous utilisez bpython , toute l'histoire de vos commandes est par défaut sauvegardée sur ~/.pythonhist .

pour sauvegarder les commandes pour un réusage ultérieur, vous pouvez les copier dans un fichier de script python:

$ cp ~/.pythonhist mycommands.py

édite alors ce fichier pour le nettoyer et le place sous le chemin Python (packages de site d'environnement global ou virtuel, répertoire courant, mention en *.la pth, ou de quelque autre manière).

pour inclure les commandes dans votre shell, il suffit de les importer à partir du fichier sauvegardé:

>>> from mycommands import *
0
répondu Aidas Bendoraitis 2017-04-26 14:46:37

j'aimerais suggérer une autre façon de maintenir la session python à travers tmux sous linux. vous exécutez tmux, attachez votre auto à la session que vous avez ouverte (si non attaché après l'avoir ouverte directement). exécutez python et faites ce que vous faites dessus. alors détachez-vous de la session. se détacher d'une session tmux ne ferme pas la session. la séance reste ouverte.

avantages de cette méthode: vous pouvez joindre à cette session à partir de n'importe quel autre appareil (en cas vous pouvez configurer votre pc)

contre de cette méthode: cette méthode n'abandonne pas les ressources utilisées par la session Python ouverte jusqu'à ce que vous existiez l'interpréteur python.

0
répondu Myonaiz 2017-06-08 01:00:49