Bayangkan situasinya: Anda telah menulis beberapa kode Python yang indah yang menghasilkan grafik yang indah sebagai output. Anda menyimpan grafik itu, secara alami, sebagai graph.png
. Anda menjalankan kode beberapa kali, setiap kali membuat modifikasi kecil. Anda kembali ke sana minggu/bulan/tahun depan. Tahukah Anda bagaimana Anda membuat grafik itu? Data input apa? Versi kode Anda apa? Jika Anda seperti saya maka jawabannya akan sering, dengan frustrasi, jadilah "tidak". Tentu saja, Anda kemudian membuang banyak waktu mencoba mencari tahu bagaimana Anda membuatnya, atau bahkan menyerah dan tidak pernah menggunakannya di koran jurnal yang akan membuat Anda hadiah nobel ...
Pembicaraan ini akan memperkenalkan Recipy (dari Resep dan Python ), modul Python yang akan menyelamatkan Anda dari situasi ini! (Meskipun tidak dapat menjamin bahwa kertas Anda yang dihasilkan akan memenangkan Hadiah Nobel!) Dengan penambahan satu baris kode ke bagian atas file Python Anda, Recipy akan mencatat setiap menjalankan kode Anda ke database, melacak File input, file output dan versi kode Anda, dan kemudian memungkinkan Anda menanyakan database ini untuk mengetahui bagaimana Anda benar -benar membuat graph.png
.
Cara termudah untuk menginstal adalah dengan hanya berjalan
pip install recipy
Atau, Anda dapat mengkloning repositori ini dan menjalankan:
python setup.py install
Jika Anda ingin menginstal dependensi secara manual (mereka harus diinstal secara otomatis jika Anda mengikuti instruksi di atas) maka jalankan:
pip install -r requirements.txt
Anda dapat meningkatkan dari rilis sebelumnya dengan menjalankan:
pip install -U recipy
Untuk mengetahui apa yang telah berubah sejak rilis terakhir, lihat Changelog
CATATAN: Versi sebelumnya (yang belum dirilis) dari Recipy mengharuskan MongoDB diinstal dan diatur secara manual. Ini tidak lagi diperlukan, karena database Python murni (TinyDB) sebagai gantinya. Juga, GUI sekarang diintegrasikan sepenuhnya ke dalam Recipy dan tidak memerlukan pemasangan secara terpisah.
Cukup tambahkan baris berikut ke bagian atas skrip Python Anda:
import recipy
Perhatikan bahwa ini harus menjadi baris teratas skrip Anda, sebelum Anda mengimpor yang lain.
Kemudian jalankan skrip Anda seperti biasa, dan semua data akan masuk ke dalam database TinyDB (jangan khawatir, database secara otomatis dibuat jika diperlukan). Anda kemudian dapat menggunakan skrip recipy
untuk dengan cepat menanyakan database untuk mengetahui apa yang dijalankan kode Anda menghasilkan file output apa. Jadi, misalnya, jika Anda menjalankan beberapa kode seperti ini:
import recipy
import numpy
arr = numpy . arange ( 10 )
arr = arr + 500
numpy . save ( 'test.npy' , arr )
(Perhatikan penambahan import recipy
di awal skrip - tetapi tidak ada perubahan lain dari skrip standar)
Atau, jalankan skrip yang tidak dimodifikasi dengan python -m recipy SCRIPT [ARGS ...]
untuk mengaktifkan logging recipy. Ini memohon titik masuk modul Recipy, yang menangani impor impor untuk Anda, sebelum menjalankan skrip Anda.
Ini akan menghasilkan output yang disebut test.npy
. Untuk mengetahui detail dari Run yang membuat file ini dapat Anda cari
recipy search test.npy
Dan itu akan menampilkan informasi seperti yang berikut:
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
Cara alternatif untuk melihat ini adalah dengan menggunakan GUI. Cukup jalankan recipy gui
dan jendela browser akan terbuka dengan antarmuka yang dapat Anda gunakan untuk mencari semua 'Runs' Recipy Anda:
Jika Anda ingin mencatat input dan output file yang dibaca atau ditulis dengan bawaan terbuka, Anda perlu melakukan sedikit lebih banyak pekerjaan. Baik menggunakan recipy.open
(hanya membutuhkan import recipy
di bagian atas skrip Anda), atau tambahkan from recipy import open
dan cukup gunakan open
. Solusi ini diperlukan, karena banyak perpustakaan menggunakan bawaan terbuka internal, dan Anda hanya ingin merekam file yang secara eksplisit Anda buka sendiri.
Jika Anda menggunakan Python 2, Anda dapat meneruskan parameter encoding
ke recipy.open
. Dalam hal ini codecs
digunakan untuk membuka file dengan pengkodean yang tepat.
Setelah Anda menjalankan beberapa di database Anda, Anda dapat 'memberi anotasi' ini dengan catatan apa pun yang ingin Anda simpan tentang mereka. Ini bisa sangat berguna untuk merekam yang berjalan bekerja dengan baik, atau masalah khusus yang Anda hadapi. Ini dapat dilakukan dari halaman 'Detail' di GUI, atau dengan berjalan
recipy annotate
yang akan membuka editor untuk memungkinkan Anda menulis catatan yang akan dilampirkan pada pelarian. Ini kemudian akan dapat dilihat melalui baris perintah dan GUI saat mencari berjalan.
Ada fitur lain di antarmuka baris perintah juga: recipy --help
untuk melihat opsi lain. Anda dapat melihat diff, lihat semua menjalankan yang membuat file dengan nama yang diberikan, pencarian berdasarkan ID, tunjukkan entri terbaru dan lainnya:
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
Recipy menyimpan semua konfigurasinya dan database itu sendiri di ~/.recipy
. File konfigurasi utama Recipy ada di dalam folder ini, yang disebut recipyrc
. Format file konfigurasi sangat sederhana, dan didasarkan pada file Windows INI - dan memiliki file konfigurasi sepenuhnya opsional: default akan berfungsi dengan baik tanpa file konfigurasi.
Contoh konfigurasi adalah:
[ignored metadata]
diff
[general]
debug
Ini hanya menginstruksikan Recipy untuk tidak menyimpan informasi git diff
ketika merekam metadata tentang menjalankan, dan juga untuk mencetak pesan debug (yang bisa sangat berguna jika Anda mencoba mencari tahu mengapa fungsi tertentu tidak ditambal). Saat ini, satu -satunya opsi yang mungkin adalah:
[general]
debug
- Cetak Pesan Debugeditor = vi
- Mengkonfigurasi editor teks default yang akan digunakan ketika Receass membutuhkan Anda untuk mengetik pesan. Gunakan Notepad jika di Windows, misalnyaquiet
- jangan mencetak pesan apapunport
- Tentukan port yang akan digunakan untuk GUI[data]
file_diff_outputs
- Simpan diff antara output lama dan file output baru, jika file output ada sebelum skrip dijalankan[database]
path = /path/to/file.json
- atur path ke file database[ignored metadata]
diff
- Jangan simpan output git diff
dalam metadata untuk menjalankan recipygit
- jangan menyimpan apa pun yang berkaitan dengan git (asal, komit, repo dll) di metadata untuk menjalankan recipyinput_hashes
- jangan menghitung dan menyimpan hash -1 hash dari file inputoutput_hashes
- jangan menghitung dan menyimpan hash -1 hash dari file output[ignored inputs]
numpy
) untuk menginstruksikan Recipy untuk tidak merekam input dari modul ini, atau all
untuk mengabaikan input dari semua modul[ignored outputs]
all
modul apa pun di sini ( numpy
. Secara default semua metadata disimpan (mis. Tidak ada metadata yang diabaikan) dan pesan debug tidak ditampilkan. File .recipyrc
dalam direktori saat ini lebih diutamakan daripada file ~/.recipy/recipyrc
, yang memungkinkan konfigurasi per proyek mudah ditangani.
Catatan: Tidak ada file konfigurasi default disediakan dengan Recipy, jadi jika Anda ingin mengkonfigurasi apa pun, Anda perlu membuat sendiri file yang diformat dengan benar.
Saat Anda mengimpor Recipy, itu menambahkan sejumlah kelas ke sys.meta_path
. Ini kemudian digunakan oleh Python sebagai bagian dari prosedur impor untuk modul. Kelas -kelas yang kami tambahkan adalah kelas yang berasal dari PatchImporter
, sering menggunakan antarmuka yang lebih mudah yang disediakan oleh PatchSimple
, yang memungkinkan kami membungkus fungsi yang melakukan input/output dalam fungsi yang memanggil Recipy terlebih dahulu untuk mencatat informasi.
Secara umum, sebagian besar kompleksitas disembunyikan di PatchImporter
dan PatchSimple
(plus utils.py
), sehingga kode yang sebenarnya untuk membungkus modul, seperti numpy
cukup sederhana:
# 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' )
Kelas seperti ini harus diimplementasikan untuk setiap modul yang input/outputnya membutuhkan pencatatan. Saat ini fungsi input dan output berikut ditambal:
Tabel ini mencantumkan modul Recipy memiliki tambalan, dan fungsi input dan output yang ditambal.
Modul | Fungsi input | Fungsi output |
---|---|---|
pandas | read_csv , read_table , read_excel , read_hdf , read_pickle , read_stata , read_msgpack | DataFrame.to_csv , DataFrame.to_excel , DataFrame.to_hdf , DataFrame.to_msgpack , DataFrame.to_Stata, DataFrame.to_stata , Panel.to_Excel, Series.to_hdf , DataFrame.to_pickle , Panel.to_excel , Panel.to_msgpack, Panel.to.to.to.to_hdf, Panel.to_hdf , Panel.to.to.to.to_hdf, Panel.to_msgpack , Panel.to_pickle , Series.to_csv , 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 , nifti2.Nifti2Image.from_filename , freesurfer.mghformat.MGHImage.from_filename , spm99analyze.Spm99AnalyzeImage.from_filename , minc1.pm99analyzeimage.from_filename, minc1.pm99analyzeimage.from_filename, minc1.pm99anyzeimage.from_filename, minc1.Minc1Image.from_filename minc2.Minc2Image.from_filename , analyze.AnalyzeImage.from_filename , parrec.PARRECImage.from_filename , spm2analyze.Spm2AnalyzeImage.from_filename | nifti1.Nifti1Image.to_filename , nifti2.Nifti2Image.to_filename , freesurfer.mghformat.MGHImage.to_filename , spm99analyze.Spm99AnalyzeImage.to_filename , minc1.Minc1Image.to_filename minc2.Minc2Image.to_filename , analyze.AnalyzeImage.to_filename , parrec.PARRECImage.to_filename , spm2analyze.Spm2AnalyzeImage.to_filename |
Namun, contoh kode di atas menunjukkan betapa mudahnya menulis kelas untuk membungkus modul baru - jadi jangan ragu untuk mengirimkan permintaan tarik untuk membuat recipy bekerja dengan modul ilmiah favorit Anda!
Kerangka Tes Recipy ada di integration_test
. Kerangka uji telah dirancang untuk berjalan di bawah Python 2.7+ dan Python 3+. Untuk informasi lebih lanjut, lihat Kerangka Tes Recipy.
Kerangka Tes dijalankan pada platform berikut: