web-dev-qa-db-fra.com

Comment enregistrer une session interactive Python?

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 éléments utiles aussi souvent que je le souhaiterais. Existe-t-il un moyen de sauvegarder mes entrées dans le shell (connexions à la base de données, affectations de variables, peu de boucles et de bits de logique) - un historique de la session interactive? Si j'utilise quelque chose comme script, je reçois trop de bruit stdout. Je n'ai pas vraiment besoin de décaper tous les objets - bien que s'il y a une solution qui fait ça, ça irait. Dans l'idéal, il ne me resterait plus qu'un script identique à celui que j'ai créé de manière interactive et je pourrais simplement supprimer les éléments dont je n'avais pas besoin. Y at-il un paquet qui fait ceci, ou une approche de bricolage?

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

  • IPython - devrait utiliser cela 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 il semble que cela va briller là-bas. Tri d'une application de bureau gtk/gnome qui rend les graphiques en ligne. Imaginez une coque hybride + calculatrice graphique + mini Eclipse. Distribution source ici: http://www.reinteract.org/trac/wiki/GettingIt . Bien conçu sur Ubuntu, il s’intègre également aux installateurs gnome desktop, Windows et Mac.
  • bpython - extrêmement cool, beaucoup de fonctionnalités intéressantes, la complétion automatique (!), le rembobinage, une sauvegarde de touche dans le fichier, l’indentation, bien joué. Python source distribution, a tiré quelques dépendances de sourceforge.

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

373
unmounted

IPython est extrêmement utile si vous aimez utiliser des sessions interactives. Par exemple, pour votre cas d'utilisation, il y a la commande magique %save , il vous suffit d'entrer %save my_useful_session 10-20 23 pour enregistrer les lignes d'entrée 10 à 20 et 23 en my_useful_session.py (pour vous aider, les lignes sont précédées de leur numéro).

En outre, la documentation indique:

Cette fonction utilise la même syntaxe que % history pour les plages d’entrée, puis enregistre les lignes sous 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 avoir un aperçu rapide des fonctionnalités.

361
Ants Aasma

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

import readline
readline.write_history_file('/home/ahj/history')
136
Roberto Z

Il y a un moyen de le faire. Stocker 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 PYTHONSTARTUP dans votre shell (par exemple, dans ~/.bashrc):

export PYTHONSTARTUP=$HOME/.pystartup

Vous pouvez également ajouter ceci 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.

85
Nadia Alramli

Si vous utilisez IPython vous pouvez enregistrer dans un fichier toutes vos commandes précédentes à l’aide de la fonction magique % historique avec le paramètre -f, p.e:

%history -f /tmp/history.py
64
nachouve

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

ipython

À partir de votre ligne de commande, exécutez simplement la commande 'magique' suivante pour enregistrer automatiquement toute votre session Ipython:

%logstart

Cela créera un fichier .py portant un nom unique et stockera votre session pour une utilisation ultérieure en tant que session interactive Ipython ou pour une utilisation dans les scripts de votre choix.

16
webappzero

De plus, reinteract vous donne une interface semblable à celle d'un carnet de notes pour une session Python.

13
Ned Batchelder

Outre IPython, un utilitaire similaire bpython dispose de la fonctionnalité "enregistrer le code que vous avez entré dans un fichier".

11
dbr

Je devais avoir du mal à trouver une réponse, j'étais très nouveau dans l'environnement iPython.

Ça va marcher

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 sauvegarder les 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é ipython).

6
Somum

Il existe une magie% historique pour l’impression et la sauvegarde de l’historique des entrées (et éventuellement de la sortie).

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

>>> %hist -f my_history.py

Historique IPython stocke 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 magique% history 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 de sortie.

Plusieurs autres fonctions magiques peuvent utiliser votre historique de saisie, notamment% edit,% réexécution,% rappel,% macro,% sauvegarde et% Pastebin. Vous pouvez utiliser un format standard pour faire référence aux lignes:

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

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

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

Veillez également à explorer les fonctionnalité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 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écifiezc.StoreMagic.autorestore = True dans ipython_config.py.

3
Alexander

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

 enter image description here

Il contient Historique et Explorateur de variables. Si vous avez travaillé avec MatLab, vous verrez les similitudes. 

3
Norfeldt

En ce qui concerne Linux, on peut utiliser la commande script pour enregistrer la session entière. Cela fait partie du paquetage util-linux et devrait donc l'être sur la plupart des systèmes Linux. Vous pouvez créer un alias ou une fonction qui appellera script -c python et qui sera enregistrée dans un fichier TypeScript. Par exemple, voici une réimpression 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

Le petit inconvénient ici est que la script enregistre tout, même les sauts de ligne, chaque fois que vous appuyez sur les backspaces, etc. Vous pouvez donc utiliser col pour nettoyer le résultat (voir ce post sur Unix & Linux Stackexchange ). 

2

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

vous pouvez l'utiliser comme un éditeur, et utiliser également comme une console - exécuter chaque ligne comme un interpréteur interactif avec un écho immédiat.

bien entendu, 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.

the overview of pyslices

1
fandyst

La commande %history est géniale, mais elle ne vous permet malheureusement pas de sauvegarder les éléments% collés dans la liste. Pour faire cela, je pense que vous devez faire %logstartau début (bien que 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 docs pour% history ici .

1
wordsforthewise

Pour enregistrer les entrées et les sorties sur XUbuntu :

  1. Dans Windows, exécutez iPython à partir de l'application de terminal Xfce. 
  2. cliquez sur Terminal dans la barre de menu supérieure et cherchez save contents dans la liste déroulante

Je trouve que cela enregistre l'entrée et la sortie, en remontant jusqu'au moment où 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.

0
Paul

J'aimerais suggérer un autre moyen de maintenir une session python via tmux sur linux. vous exécutez tmux, attachez-vous à la session que vous avez ouverte (si elle n’est pas attachée après l’avoir ouverte 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. 

pros de cette méthode: vous pouvez vous connecter à cette session à partir de n’importe quel autre périphérique (au cas où vous pouvez ssh votre ordinateur)

inconvénients de cette méthode: Cette méthode ne renonce pas aux ressources utilisées par la session python ouverte tant que vous n’existez pas l’interprète python. 

0
Myonaiz

Certains commentaires demandaient comment enregistrer toutes les entrées IPython en même temps. Pour% save magic in IPython, vous pouvez enregistrer toutes les commandes par programme, comme indiqué ci-dessous, afin d'éviter le message Invite et d'éviter de spécifier les numéros saisis. currentLine = len (In) -1 % save -f my_session 1- $ currentLine

L'option -f est utilisée pour forcer le remplacement de fichier et la len(IN)-1 affiche l'invite d'entrée actuelle dans IPython, ce qui vous permet d'enregistrer toute la session par programme. 

0
E. F. Haghish

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

Pour enregistrer les commandes pour les réutiliser ultérieurement, vous pouvez les copier dans un fichier de script python:

$ cp ~/.pythonhist mycommands.py

Editez ensuite ce fichier pour le nettoyer et placez-le sous le chemin Python (packages-site, répertoire actuel de l'environnement global ou virtuel, avec une mention entre * .pth ou autrement).

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

>>> from mycommands import *
0
Aidas Bendoraitis

Pour ceux qui utilisent spacemacs et ipython fournis avec python-layer, save magic crée beaucoup de sorties non désirées, en raison de la commande d'auto-complétion constante fonctionnant en arrière-plan, telle 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, enregistrez simplement le tampon ipython comme tout autre: spc f s

0
Kaan E.