Wie speichere ich eine interaktive Python-Sitzung?

416

Ich benutze häufig den Python-Interpreter, um mit Datenbanken, Dateien usw. zu arbeiten - im Grunde genommen viele manuelle Formatierungen von halbstrukturierten Daten. Ich speichere und bereinige die nützlichen Teile nicht so oft, wie ich möchte. Gibt es eine Möglichkeit, meine Eingaben in der Shell zu speichern (Datenbankverbindungen, Variablenzuweisungen, wenig für Schleifen und Logikbits) - eine Geschichte der interaktiven Sitzung? Wenn ich so etwas wie benutze, scriptbekomme ich zu viel Standardgeräusch. Ich muss nicht wirklich alle Objekte einlegen - aber wenn es eine Lösung gibt, die das macht, wäre es in Ordnung. Im Idealfall bleibt mir nur ein Skript übrig, das so ausgeführt wird, wie ich es interaktiv erstellt habe, und ich kann einfach die Bits löschen, die ich nicht benötige. Gibt es ein Paket, das dies tut, oder einen DIY-Ansatz?

UPDATE : Ich bin wirklich erstaunt über die Qualität und Nützlichkeit dieser Pakete. Für diejenigen mit einem ähnlichen Juckreiz:

  • IPython - sollte dies schon seit Ewigkeiten verwenden, so wie ich es mir vorgestellt hatte
  • Reinteract - sehr beeindruckend, ich möchte mehr über Visualisierung erfahren und dies scheint dort zu leuchten. Eine Art GTK / Gnome-Desktop-App, die Diagramme inline rendert. Stellen Sie sich eine Hybrid-Shell + Grafikrechner + Mini-Eclipse vor. Quellenverteilung hier: http://www.reinteract.org/trac/wiki/GettingIt . Es wurde unter Ubuntu entwickelt und lässt sich auch in Gnome Desktop-, Windows- und Mac-Installationsprogramme integrieren.
  • bpython - extrem cool, viele nette Funktionen, Autocomplete (!), Rücklauf, ein Tastendruck in Datei speichern, Einrückung, gut gemacht. Python-Quelldistribution, zog einige Abhängigkeiten von SourceForge.

Ich bin konvertiert, diese erfüllen wirklich ein Bedürfnis zwischen Dolmetscher und Redakteur.

unmontiert
quelle

Antworten:

411

IPython ist äußerst nützlich, wenn Sie interaktive Sitzungen verwenden möchten. Für Ihren Anwendungsfall gibt es beispielsweise den %saveBefehl magic , den Sie nur eingeben %save my_useful_session 10-20 23, um die Eingabezeilen 10 bis 20 und 23 zu speichern my_useful_session.py(um dies zu erleichtern, wird jeder Zeile die Nummer vorangestellt).

Darüber hinaus heißt es in der Dokumentation:

Diese Funktion verwendet dieselbe Syntax wie % history für Eingabebereiche und speichert die Zeilen dann unter dem von Ihnen angegebenen Dateinamen.

Dies ermöglicht es beispielsweise, auf ältere Sitzungen zu verweisen, wie z

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

Schauen Sie sich die Videos auf der Präsentationsseite an, um einen schnellen Überblick über die Funktionen zu erhalten.

Ameisen Aasma
quelle
11
Wie speichere ich alle Zeilen? Ohne Angabe des Bereichs wird eine leere Datei erstellt. :(
Balki
39
@balki, die IPython-Eingabeaufforderung gibt an, wie viele Zeilen sich in Ihrem Verlauf befinden (dh In[48]). So save filename 1-48würde Ihre ganze Sitzung speichern.
Ben Seite
2
Ist es auch möglich, diese Datei wieder in ipython zu laden und Ihren Eingabeverlauf beizubehalten?
Ben Seite
15
@BenPage Verwenden Sie "ipython -i [Dateiname]" für die gespeicherte .py-Datei von der Bash-Eingabeaufforderung, um die Datei zurück zu laden, bevor Sie zu einer interaktiven Konsole zurückkehren! (Ohne das Flag -i erhalten Sie die interaktive Konsole nach dem Ausführen der Datei nicht).
Samuel Lampa
9
@ user4779, wie man erwarten würde:%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.
quelle
10
Erstellt eine leere Datei für mich unter Windows 7
Ubershmekel
10
Hat in Ubuntu wie ein Zauber für mich funktioniert.
Johndt6
4
@ubershmekel - Sieht aus wie es nur unter Unix funktioniert
Joel B
28
Schlägt auf meinem TI-83
Dan
1
Denken Sie daran, dies am Ende Ihrer Sitzung zu tun. Meins sah etwas leer aus, nachdem ich die Funktion erst zu Beginn aufgerufen hatte.
Delphus333
95

Es gibt einen Weg , dies zu tun. Speichern Sie die Datei in ~/.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

und setzen Sie dann die Umgebungsvariable PYTHONSTARTUPin Ihrer Shell (z. B. in ~/.bashrc):

export PYTHONSTARTUP=$HOME/.pystartup

Sie können dies auch hinzufügen, um die automatische Vervollständigung kostenlos zu erhalten:

readline.parse_and_bind('tab: complete')

Bitte beachten Sie, dass dies nur auf * nix-Systemen funktioniert. Da readline nur in der Unix-Plattform verfügbar ist.

Nadia Alramli
quelle
Mac OS X verwendet editline, daher stehen Funktionen zur vollständigen Tabulatorisierung zur Verfügung, der genaue Befehl ist jedoch anders: readline.parse_and_bind ("bind ^ I rl_complete")
Miles
Das war schnell verrückt, Nadia, vielen Dank. Ich werde versuchen , beide Antworten - Zielplattform ist Ubuntu, BTW
unmontiert
readline.parse_and_bind('tab: complete')funktioniert, wenn Sie MacPorts Python verwenden.
Phillip Cloud
3
Dies sollte gerahmt werden. Arbeitete an RHEL 6.6. Pyenv, 2.7.10.
BilliAm
Warum ich all die Jahre nicht danach gesucht habe! Diese Lösung ist großartig, da sie ein Originalwerkzeug verwendet, das schnell und leicht ist.
Iman
75

Wenn Sie IPython verwenden , können Sie alle Ihre vorherigen Befehle mithilfe der magischen Funktion % history mit dem Parameter -f in einer Datei speichern : pe:

%history -f /tmp/history.py
nachouve
quelle
War nicht sicher über den Speicherort der Datei mit saveMagie. Dies war sehr hilfreich
alpha_989
4
Verwenden Sie %history -g -f full_history.pydiese Option , um den Verlauf aller Sitzungen abzurufen, nicht nur der aktuellen. Siehe auch: Dokumentation für% history .
Evgeni Sergeev
19

Nach der Installation von Ipython und dem Öffnen einer Ipython-Sitzung durch Ausführen des folgenden Befehls:

ipython

Führen Sie in Ihrer Befehlszeile einfach den folgenden Ipython-Befehl 'magic' aus, um Ihre gesamte Ipython-Sitzung automatisch zu protokollieren:

%logstart

Dadurch wird eine eindeutig benannte .py-Datei erstellt und Ihre Sitzung zur späteren Verwendung als interaktive Ipython-Sitzung oder zur Verwendung in den Skripten Ihrer Wahl gespeichert.

webappzero
quelle
14

Durch die erneute Interaktion erhalten Sie außerdem eine Notebook-ähnliche Oberfläche für eine Python-Sitzung.

Ned Batchelder
quelle
4
reinteractwird jetzt durch das IPython Notebook und QtConsole ersetzt.
Eric O Lebigot
11

Zusätzlich zu IPython verfügt ein ähnliches Dienstprogramm, bpython, über die Funktion "Speichern Sie den von Ihnen eingegebenen Code in einer Datei"

dbr
quelle
3
kann jemand erklären, wie das mit bpython gemacht wird? Ich habe Strg + s ausprobiert, aber es hat nicht funktioniert (Version 0.14.2 auf Python 3.4.3 mit Gnome-Terminal)
Yibo Yang
Es ist standardmäßig an F7 gebunden. F1 zeigt Ihnen die Hilfe und die aktuellen Tastenkombinationen.
Jim K.
F7 startet den externen Editor. Strg + s sollte zu einer einfachen Funktion zum Speichern in Dateien auffordern, die jedoch in bash und zsh unbedingt "gestoppt" werden muss. Daher müssen Sie in der bpython-Konfiguration eine Alternative auswählen.
RCross
8

Ich musste kämpfen, um eine Antwort zu finden. Ich war sehr neu in der iPython-Umgebung.

Das wird funktionieren

Wenn Ihre iPython-Sitzung so aussieht

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})

Sie möchten Zeilen von 1 bis 135 speichern und dann in derselben Ipython-Sitzung diesen Befehl verwenden

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

Dadurch werden alle Ihre Python-Anweisungen in der Datei test.py in Ihrem aktuellen Verzeichnis gespeichert (in dem Sie ipython initiiert haben).

Somum
quelle
3

Es gibt% history magic zum Drucken und Speichern des Eingabeverlaufs (und optional der Ausgabe).

So speichern Sie Ihre aktuelle Sitzung in einer Datei mit dem Namen my_history.py:

>>> %hist -f my_history.py

Verlauf IPython speichert sowohl die von Ihnen eingegebenen Befehle als auch die daraus resultierenden Ergebnisse. Sie können frühere Befehle einfach mit den Aufwärts- und Abwärtspfeiltasten durchgehen oder auf komplexere Weise auf Ihren Verlauf zugreifen.

Mit der magischen Funktion% history können Sie frühere Ein- und Ausgaben untersuchen. Der Eingabeverlauf früherer Sitzungen wird in einer Datenbank gespeichert, und IPython kann so konfiguriert werden, dass der Ausgabeverlauf gespeichert wird.

Verschiedene andere magische Funktionen können Ihren Eingabeverlauf verwenden, darunter% edit,% rerun,% Recall,% macro,% save und% pastebin. Sie können ein Standardformat verwenden, um auf Zeilen zu verweisen:

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

Dies übernimmt die Zeilen 3 und 18 bis 20 aus der aktuellen Sitzung und die Zeilen 1 bis 5 aus der vorherigen Sitzung.

Siehe% history? für den Docstring und weitere Beispiele.

Informieren Sie sich auch über die Funktionen von % store magic für die einfache Persistenz von Variablen in IPython.

Speichert Variablen, Aliase und Makros in der IPython-Datenbank.

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}

Geben Sie c.StoreMagic.autorestore = Truein ipython_config.py an, um gespeicherte Variablen beim Start automatisch wiederherzustellen.

Alexander
quelle
Das Aktivieren des Speicherns des Ausgabeverlaufs kann durch Aktivieren c.HistoryManager.db_log_outputin der Konfigurationsdatei erfolgen.
Ikke
3

Geben Sie einfach einen weiteren Vorschlag in die Schüssel: Spyder

Geben Sie hier die Bildbeschreibung ein

Es verfügt über ein Verlaufsprotokoll und einen Variablen-Explorer . Wenn Sie mit MatLab gearbeitet haben, werden Sie die Ähnlichkeiten sehen.

Norfeldt
quelle
2

Unter Linux kann man den scriptBefehl verwenden, um die gesamte Sitzung aufzuzeichnen. Es ist Teil des util-linuxPakets und sollte daher auf den meisten Linux-Systemen vorhanden sein. Sie können einen Alias ​​oder eine Funktion erstellen, die aufgerufen script -c pythonund in einer typescriptDatei gespeichert werden. Hier ist zum Beispiel ein Nachdruck einer solchen Datei.

$ 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

Ein kleiner Nachteil hierbei ist, dass scriptalles aufgezeichnet wird, auch Zeilenvorschübe, wenn Sie auf Backspaces usw. stoßen . Daher möchten Sie möglicherweise coldie Ausgabe bereinigen (siehe diesen Beitrag zu Unix & Linux Stackexchange ).

Sergiy Kolodyazhnyy
quelle
2

Der %historyBefehl ist fantastisch, aber leider können Sie damit keine Dinge speichern, die% paste in den Sesh eingefügt wurden. Um das zu tun, denke ich, müssen Sie %logstart am Anfang tun (obwohl ich nicht bestätigt habe, dass dies funktioniert).

Was ich gerne mache ist

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

Dadurch werden die Ausgabe, die Zeilennummern und '>>>' vor jeder Eingabe gespeichert (Optionen o, n und p). % Verlauf finden Sie in den Dokumenten hier .

Worte dafür
quelle
1

Es gibt noch eine andere Option - Pyslice. In den "wxpython 2.8 docs-Demos und -Tools" gibt es ein Open-Source-Programm namens "pyslices".

Sie können es wie einen Editor verwenden und es unterstützt auch die Verwendung wie eine Konsole ---- jede Zeile wie einen interaktiven Interpreter mit sofortigem Echo ausführen.

Natürlich werden alle Codeblöcke und Ergebnisse jedes Blocks automatisch in einer txt-Datei aufgezeichnet.

Die Ergebnisse werden direkt hinter dem entsprechenden Codeblock protokolliert. sehr angenehm.

die Übersicht der Pyslices

Fandyst
quelle
PySlices Autor hier. Ich bin froh, dass du PySlices magst (und dass du es sogar gefunden hast). Es ist noch nicht ganz aufgegeben (ich benutze es eigentlich immer noch), aber die in wxPython selbst enthaltene Version funktioniert oft nicht gut. Wenn Sie Updates folgen möchten, können Sie diese aus dem Paket wx_py herunterladen: pypi.python.org/pypi/wx_py , github.com/davidmashburn/wx_py
David
1

Wenn Sie bpython verwenden , wird der gesamte Befehlsverlauf standardmäßig in gespeichert ~/.pythonhist.

Um die Befehle für eine spätere Wiederverwendung zu speichern, können Sie sie in eine Python-Skriptdatei kopieren:

$ cp ~/.pythonhist mycommands.py

Bearbeiten Sie dann diese Datei, um sie zu bereinigen, und fügen Sie sie unter den Python-Pfad ein (Site-Pakete der globalen oder virtuellen Umgebung, aktuelles Verzeichnis, Erwähnung in * .pth oder auf andere Weise).

Um die Befehle in Ihre Shell aufzunehmen, importieren Sie sie einfach aus der gespeicherten Datei:

>>> from mycommands import *
Aidas Bendoraitis
quelle
Lebensretter. eine schwer zu findende Antwort
Mehdi LAMRANI
0

In einigen Kommentaren wurde gefragt, wie alle IPython-Eingaben gleichzeitig gespeichert werden sollen. Für% save magic in IPython können Sie alle Befehle wie unten gezeigt programmgesteuert speichern, um die Eingabeaufforderung und die Angabe der Eingabenummern zu vermeiden. currentLine = len (In) -1% save -f my_session 1- $ currentLine

Die -fOption wird zum Erzwingen des Ersetzens von Dateien verwendet und len(IN)-1zeigt die aktuelle Eingabeaufforderung in IPython an, sodass Sie die gesamte Sitzung programmgesteuert speichern können.

EF Haghish
quelle
0

Für diejenigen mit spacemacs, und ipythondas kommt mit python-layer, speichert Magie viele unerwünschten Ausgabe, wegen des konstant im Hintergrund Auto-Vervollständigung Befehls erstellt Arbeiten wie zum Beispiel:

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)

Um dies zu vermeiden, speichern Sie einfach den Ipython-Puffer wie gewohnt: spc f s

Kaan E.
quelle
0

Ich möchte einen anderen Weg vorschlagen, um die Python-Sitzung über tmux unter Linux aufrechtzuerhalten. Wenn Sie tmux ausführen, hängen Sie sich an die Sitzung an, die Sie geöffnet haben (falls nicht direkt nach dem Öffnen). Führen Sie Python aus und tun Sie, was immer Sie darauf tun. dann von der Sitzung trennen. Durch das Trennen von einer tmux-Sitzung wird die Sitzung nicht geschlossen. Die Sitzung bleibt offen.

Vorteile dieser Methode: Sie können von jedem anderen Gerät aus eine Verbindung zu dieser Sitzung herstellen (falls Sie Ihren PC ssh können).

Nachteile dieser Methode: Diese Methode gibt die von der geöffneten Python-Sitzung verwendeten Ressourcen erst dann frei, wenn Sie tatsächlich über den Python-Interpreter verfügen.

Myonaiz
quelle
0

So speichern Sie Ein- und Ausgaben auf XUbuntu :

  1. Führen Sie in XWindows iPython über die Xfce-Terminal-App aus
  2. Klicken Sie Terminalin die obere Menüleiste und suchen Sie save contentsin der Dropdown-Liste

Ich finde, dass dies die Ein- und Ausgabe speichert und bis zum Öffnen des Terminals zurückreicht. Dies ist nicht ipython-spezifisch und funktioniert mit SSH-Sitzungen oder anderen Aufgaben, die über das Terminalfenster ausgeführt werden.

Paul
quelle