Stellen Sie sich die Situation vor: Sie haben einen wunderbaren Python -Code geschrieben, der eine schöne Grafik als Ausgabe erzeugt. Sie speichern dieses Diagramm natürlich als graph.png
. Sie führen den Code ein paar Mal aus, was jedes Mal geringfügige Änderungen vornimmt. Sie kommen in der nächsten Woche/Monat/Jahr darauf zurück. Wissen Sie, wie Sie diese Grafik erstellt haben? Welche Eingabedaten? Welche Version Ihres Codes? Wenn Sie so etwas wie ich sind, wird die Antwort oft, frustrierend, "nein" sein. Natürlich verschwenden Sie dann viel Zeit damit, herauszufinden, wie Sie es geschaffen haben, oder geben Sie es sogar auf und verwenden Sie es nie in dieser Zeitschriftenpapier, die Ihnen einen Nobelpreis gewinnen wird.
In diesem Vortrag wird Recipy (aus Rezept und Python ) eingebracht, ein Python -Modul, das Sie vor dieser Situation erspart! (Obwohl es nicht garantieren kann, dass Ihr resultierendes Papier einen Nobelpreis gewinnt!) Mit der Hinzufügung einer einzigen Codezeile an die Spitze Ihrer Python -Dateien protokolliert Recipy jeden Lauf Ihres Code Die Eingabedateien, die Ausgabedateien und die Version Ihres Codes und dann können Sie diese Datenbank abfragen, um herauszufinden, wie Sie tatsächlich graph.png
erstellt haben.
Der einfachste Weg zu installieren ist einfach, einfach zu laufen
pip install recipy
Alternativ können Sie dieses Repository klonen und ausführen:
python setup.py install
Wenn Sie die Abhängigkeiten manuell installieren möchten (sie sollten automatisch installiert werden, wenn Sie den obigen Anweisungen folgen), fahren Sie mit:
pip install -r requirements.txt
Sie können von einer vorherigen Version durch Rennen ein Upgrade durchführen:
pip install -U recipy
Um herauszufinden, was sich seit der letzten Veröffentlichung geändert hat, sehen Sie sich den Changelog an
HINWEIS: Vorherige (unveröffentlichte) Versionen der Rezeption mussten MongoDB installiert und manuell einrichten. Dies ist nicht mehr erforderlich, da stattdessen eine reine Python -Datenbank (TinyDB) verwendet wird. Außerdem ist die GUI jetzt vollständig in die Rezeption integriert und muss nicht separat installiert werden.
Fügen Sie einfach die folgende Zeile an die Spitze Ihres Python -Skripts hinzu:
import recipy
Beachten Sie, dass dies die oberste Zeile Ihres Skripts sein muss , bevor Sie etwas anderes importieren.
Führen Sie dann einfach Ihr Skript wie gewohnt aus, und alle Daten werden in der TinyDB -Datenbank angemeldet (keine Sorge, die Datenbank wird bei Bedarf automatisch erstellt). Sie können dann das recipy
-Skript verwenden, um die Datenbank schnell abzufragen, um herauszufinden, welche Ausführungen Ihres Codes welche Ausgabedatei erstellt haben. Also zum Beispiel, wenn Sie einen solchen Code ausführen:
import recipy
import numpy
arr = numpy . arange ( 10 )
arr = arr + 500
numpy . save ( 'test.npy' , arr )
(Beachten Sie die Hinzufügung von import recipy
zu Beginn des Skripts - aber es gibt keine anderen Änderungen in einem Standard -Skript)
Führen Sie alternativ ein unmodifiziertes Skript mit python -m recipy SCRIPT [ARGS ...]
um die Protokollierung der Empfänglichkeit zu ermöglichen. Dies ruft den Modul -Einstiegspunkt von Recipy auf, der sich um die Import von Recipy für Sie kümmert, bevor Sie Ihr Skript ausführen.
Es erzeugt einen Ausgang namens test.npy
. Um die Details des Ausführens zu finden, der diese Datei erstellt hat, können Sie mithilfe der Datei suchen
recipy search test.npy
und es werden Informationen wie folgende angezeigt:
Created by robin on 2015-05-25 19:00:15.631000
Ran /Users/robin/code/recipy/example_script.py using /usr/local/opt/python/bin/python2.7
Git: commit 91a245e5ea82f33ae58380629b6586883cca3ac4, in repo /Users/robin/code/recipy, with origin [email protected]:recipy/recipy.git
Environment: Darwin-14.3.0-x86_64-i386-64bit, python 2.7.9 (default, Feb 10 2015, 03:28:08)
Inputs:
Outputs:
/Users/robin/code/recipy/test.npy
Eine alternative Möglichkeit, dies zu sehen, besteht darin, die GUI zu verwenden. Führen Sie einfach recipy gui
aus und ein Browserfenster wird mit einer Schnittstelle geöffnet, mit der Sie alle Ihre Recipy -Ausführungen durchsuchen können:
Wenn Sie Eingänge und Ausgänge von Dateien protokollieren möchten, die mit integrierten Open gelesen oder geschrieben wurden, müssen Sie etwas mehr Arbeit leisten. Verwenden Sie entweder recipy.open
(erfordert nur import recipy
oben in Ihrem Skript) oder fügen Sie from recipy import open
und verwenden Sie einfach open
. Diese Problemumgehung ist erforderlich, da viele Bibliotheken integriert werden und Sie nur die Dateien aufzeichnen möchten, die Sie selbst ausdrücklich geöffnet haben.
Wenn Sie Python 2 verwenden, können Sie einen encoding
an recipy.open
übergeben. In diesem Fall wird codecs
verwendet, um die Datei mit ordnungsgemäßer Codierung zu öffnen.
Sobald Sie einige Läufe in Ihrer Datenbank erhalten haben, können Sie diese Läufe mit allen Notizen, die Sie über sie halten möchten, "kommentieren". Dies kann besonders nützlich für die Aufzeichnung sein, die gut funktioniert, oder bestimmte Probleme, auf die Sie gestoßen sind. Dies kann aus der Seite "Details" in der GUI oder durch Laufen erfolgen
recipy annotate
Dies öffnet einen Editor, damit Sie Notizen schreiben können, die dem Lauf beigefügt werden. Diese können dann über die Befehlszeile und die GUI angezeigt werden, wenn Sie nach Läufen suchen.
Es gibt auch andere Funktionen in der Befehlszeilenschnittstelle: recipy --help
um die anderen Optionen zu sehen. Sie können Diffs anzeigen, alle Läufe anzeigen, in denen eine Datei mit einem bestimmten Namen erstellt wurde, auf der Basis von IDs suchen, den neuesten Eintrag anzeigen und mehr:
recipy - a frictionless provenance tool for Python
Usage:
recipy search [options] <outputfile>
recipy latest [options]
recipy gui [options]
recipy annotate [<idvalue>]
recipy (-h | --help)
recipy --version
Options:
-h --help Show this screen
--version Show version
-a --all Show all results (otherwise just latest result given)
-f --fuzzy Use fuzzy searching on filename
-r --regex Use regex searching on filename
-i --id Search based on (a fragment of) the run ID
-v --verbose Be verbose
-d --diff Show diff
-j --json Show output as JSON
--no-browser Do not open browser window
--debug Turn on debugging mode
Requeaty speichert die gesamte Konfiguration und die Datenbank selbst in ~/.recipy
. Die Hauptkonfigurationsdatei von Requeme befindet sich in diesem Ordner, der recipyrc
bezeichnet wird. Das Konfigurationsdateiformat ist sehr einfach und basiert auf Windows Ini -Dateien - und eine Konfigurationsdatei ist vollständig optional: Die Standardeinstellungen funktionieren ohne Konfigurationsdatei einwandfrei.
Eine Beispielkonfiguration ist:
[ignored metadata]
diff
[general]
debug
Auf diese Weise wird das Empfänger einfach angewiesen, keine git diff
-Informationen zu speichern, wenn sie Metadaten über einen Lauf aufzeichnet, und auch Debug -Nachrichten zu drucken (was wirklich nützlich sein kann, wenn Sie versuchen, herauszufinden, warum bestimmte Funktionen nicht gepatcht werden). Im Moment sind die einzigen möglichen Optionen:
[general]
debug
- Debug -Nachrichten druckeneditor = vi
- Konfigurieren Sie den Standardtext -Editor, der verwendet wird, wenn der Recipy Sie eine Nachricht eingeben muss. Verwenden Sie beispielsweise Notepad, wenn Sie unter Windows sindquiet
- drucken Sie keine Nachrichten ausport
- Geben Sie den Port für die GUI an[data]
file_diff_outputs
- Speichern Sie den Unterschied zwischen der alten Ausgabe und der neuen Ausgabedatei, wenn die Ausgabedatei vorhanden ist, bevor das Skript ausgeführt wird[database]
path = /path/to/file.json
- Setzen Sie den Pfad in die Datenbankdatei[ignored metadata]
diff
- Speichern Sie den Ausgang von git diff
in den Metadaten nicht für einen Rezeptumgit
- Speichern Sie nichts in Bezug auf Git (Origin, Commit, Repo usw.) in den Metadaten für einen Empfängerlaufinput_hashes
- SHA -1 -Hashes von Eingabedateien nicht berechnen und speichernoutput_hashes
- SHA -1 -Hashes von Ausgabedateien nicht berechnen und speichern[ignored inputs]
numpy
) auf, um Require all
veranlassen[ignored outputs]
numpy
) auf, um Require all
veranlassen Standardmäßig wird alle Metadaten gespeichert (dh keine Metadaten werden ignoriert) und Debug -Nachrichten werden nicht angezeigt. Eine .recipyrc
Datei im aktuellen Verzeichnis hat Vorrang vor der Datei ~/.recipy/recipyrc
, sodass die pro-projektierenden Konfigurationen einfach behandelt werden können.
HINWEIS: Es wird keine Standardkonfigurationsdatei zur Verfügung gestellt. Wenn Sie also alles konfigurieren möchten, müssen Sie selbst eine ordnungsgemäß formatierte Datei erstellen.
Wenn Sie die Wiedergabe importieren, fügt es eine Reihe von Klassen zu sys.meta_path
hinzu. Diese werden dann von Python als Teil des Importverfahrens für Module verwendet. Die von uns hinzugefügten Klassen sind Klassen, die von PatchImporter
abgeleitet wurden, häufig mit der einfacheren Schnittstelle, die PatchSimple
bereitstellt, die es uns ermöglichen, Funktionen zu wickeln, die Eingabe/Ausgabe in einer Funktion ausführen, die zuerst die Informationen zum Anmelden der Informationen aufruft.
Im Allgemeinen ist der größte Teil der Komplexität in PatchImporter
und PatchSimple
(plus utils.py
) versteckt, sodass der tatsächliche Code zum Wickeln eines Moduls wie numpy
ziemlich einfach ist:
# Inherit from PatchSimple
class PatchNumpy ( PatchSimple ):
# Specify the full name of the module
modulename = 'numpy'
# List functions that are involved in input/output
# these can be anything that can go after "modulename."
# so they could be something like "pyplot.savefig" for example
input_functions = [ 'genfromtxt' , 'loadtxt' , 'load' , 'fromfile' ]
output_functions = [ 'save' , 'savez' , 'savez_compressed' , 'savetxt' ]
# Define the functions that will be used to wrap the input/output
# functions.
# In this case we are calling the log_input function to log it to the DB
# and we are giving it the 0th argument from the function (because all of
# the functions above take the filename as the 0th argument), and telling
# it that it came from numpy.
input_wrapper = create_wrapper ( log_input , 0 , 'numpy' )
output_wrapper = create_wrapper ( log_output , 0 , 'numpy' )
Für jedes Modul muss eine Klasse wie diese implementiert werden, deren Eingabe/Ausgabe eine Protokollierung benötigt. Momentan werden die folgenden Eingangs- und Ausgangsfunktionen gepatcht:
Diese Tabelle listet die Module auf, für die Patches für Patches und die Eingangs- und Ausgabefunktionen gepatcht werden.
Modul | Eingabefunktionen | Ausgabefunktionen |
---|---|---|
pandas | read_csv , read_table , read_excel , read_hdf , read_pickle , read_stata , read_msgpack | DataFrame.to_csv Panel.to_msgpack DataFrame.to_excel Panel.to_pickle DataFrame.to_hdf Series.to_csv DataFrame.to_msgpack Series.to_hdf DataFrame.to_stata Series.to_msgpack Panel.to_excel Panel.to_hdf DataFrame.to_pickle Series.to_msgpack , Series.to_pickle |
matplotlib.pyplot | savefig | |
numpy | genfromtxt , loadtxt , fromfile | save , savez , savez_compressed , savetxt |
lxml.etree | parse , iterparse | |
bs4 | BeautifulSoup | |
gdal | Open | Driver.Create , Driver.CreateCopy |
sklearn | datasets.load_svmlight_file | datasets.dump_svmlight_file |
nibabel | nifti1.Nifti1Image.from_filename minc1.Minc1Image.from_filename nifti2.Nifti2Image.from_filename , freesurfer.mghformat.MGHImage.from_filename , spm99analyze.Spm99AnalyzeImage.from_filename minc2.Minc2Image.from_filename , analyze.AnalyzeImage.from_filename , parrec.PARRECImage.from_filename , spm2analyze.Spm2AnalyzeImage.from_filename | nifti1.Nifti1Image.to_filename minc1.Minc1Image.to_filename nifti2.Nifti2Image.to_filename , freesurfer.mghformat.MGHImage.to_filename , spm99analyze.Spm99AnalyzeImage.to_filename minc2.Minc2Image.to_filename , analyze.AnalyzeImage.to_filename , parrec.PARRECImage.to_filename , spm2analyze.Spm2AnalyzeImage.to_filename |
Das obige Codebeispiel zeigt jedoch, wie einfach es ist, eine Klasse zum Wickeln eines neuen Moduls zu schreiben. Bitte senden Sie bitte eine Pull -Anfrage, um die Rezeption mit Ihren bevorzugten wissenschaftlichen Modulen zum Laufen zu bringen!
Der Test -Framework von Requeme ist in integration_test
. Das Testframework wurde so konzipiert, dass er sowohl unter Python 2.7+ als auch unter Python 3+ ausgeführt wird. Weitere Informationen finden Sie unter dem Recipy -Test -Framework.
Das Testframework wird auf den folgenden Plattformen ausgeführt: