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:
Je suis converti, ceux-ci répondent vraiment à un besoin entre interprète et éditeur.
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.
http://www.andrewhjon.es/save-interactive-python-session-history
import readline
readline.write_history_file('/home/ahj/history')
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.
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
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.
De plus, reinteract vous donne une interface semblable à celle d'un carnet de notes pour une session Python.
Outre IPython, un utilitaire similaire bpython dispose de la fonctionnalité "enregistrer le code que vous avez entré dans un fichier".
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).
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.
Il suffit de mettre une autre suggestion dans le bol: Spyder
Il contient Historique et Explorateur de variables. Si vous avez travaillé avec MatLab, vous verrez les similitudes.
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 ).
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.
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 %logstart
au 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 .
Pour enregistrer les entrées et les sorties sur XUbuntu :
Terminal
dans la barre de menu supérieure et cherchez save contents
dans la liste déroulanteJe 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.
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.
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.
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 *
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