状況を想像してみてください。出力として美しいグラフを生成する素晴らしいPythonコードをいくつか書きました。 graph.png
として、そのグラフを十分に十分に保存します。コードを数回実行するたびに、マイナーな変更を加えるたびに実行します。次の週/月/年に戻ってきます。そのグラフをどのように作成したか知っていますか?どの入力データですか?あなたのコードのバージョンは?あなたが私のような人なら、答えは頻繁に、イライラして、「いいえ」になります。もちろん、あなたはそれをどのように作成したかを解決しようとして多くの時間を無駄にしたり、あきらめたり、ノーベル賞を受賞したそのジャーナルペーパーでそれを使用しないでください…
この講演では、この状況からあなたを救うPythonモジュールであるレシピ( Recipe and Python )が紹介されます! (結果の論文がノーベル賞を獲得することを保証することはできませんが!)Pythonファイルの上部に単一のコードを追加することにより、レシピはコードの各実行をデータベースにログに記録し、入力ファイル、出力ファイル、およびコードのバージョンを使用してから、このデータベースを照会して、実際にどのようにgraph.png
作成したかを確認できます。
インストールする最も簡単な方法は、単に実行することです
pip install recipy
または、このリポジトリをクローンして実行できます。
python setup.py install
依存関係を手動でインストールする場合(上記の手順に従う場合は自動的にインストールする必要があります)。
pip install -r requirements.txt
実行して、以前のリリースからアップグレードできます。
pip install -U recipy
前回のリリース以来何が変わったのかを知るには、The Changelogを参照してください
注:レシピのある(未発表)バージョンは、手動でインストールしてセットアップする必要があります。代わりに純粋なPythonデータベース(TinyDB)が使用されるため、これはもはや必要ありません。また、GUIはレシピに完全に統合されており、個別にインストールする必要はありません。
次の行をPythonスクリプトの上部に追加するだけです。
import recipy
これは、他のものをインポートする前に、スクリプトの一番上の行でなければならないことに注意してください。
次に、通常どおりスクリプトを実行するだけで、すべてのデータがTinyDBデータベースにログインされます(心配しないでください。データベースは必要に応じて自動的に作成されます)。その後、 recipy
Scriptを使用して、データベースをすばやく照会して、コードの実行がどの出力ファイルを生成したかを確認できます。したがって、たとえば、このようなコードを実行した場合:
import recipy
import numpy
arr = numpy . arange ( 10 )
arr = arr + 500
numpy . save ( 'test.npy' , arr )
(スクリプトの開始時にimport recipy
の追加に注意してください - しかし、標準スクリプトからの他の変更はありません)
または、 python -m recipy SCRIPT [ARGS ...]
を使用して変更されていないスクリプトを実行して、レシピのロギングを有効にします。これにより、スクリプトを実行する前に、レシピのモジュールエントリポイントが呼び出されます。
test.npy
と呼ばれる出力を生成します。このファイルを作成した実行の詳細を見つけるには、使用して検索できます
recipy search test.npy
次のような情報が表示されます。
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
これを表示する別の方法は、GUIを使用することです。 recipy gui
実行するだけで、ブラウザウィンドウがすべてのレシピの「実行」を検索するために使用できるインターフェイスで開きます。
内蔵開いた状態で読み取りまたは書き込まれたファイルの入力と出力を記録する場合は、もう少し作業を行う必要があります。 recipy.open
を使用するか(スクリプトの上部にimport recipy
のみが必要です)、またはfrom recipy import open
追加してopen
だけです。多くのライブラリが内部で開いた内蔵を使用しており、明示的に自分で開いたファイルのみを記録したいため、この回避策が必要です。
Python 2を使用する場合、 encoding
パラメーターをrecipy.open
に渡すことができます。この場合、 codecs
適切なエンコードでファイルを開くために使用されます。
データベースでいくつかの実行を取得したら、これらのランを「注釈」することができます。これは、実行された録音や、遭遇した特定の問題に特に役立ちます。これは、GUIの「詳細」ページから、または実行することで実行できます
recipy annotate
これにより、編集者が開き、実行に添付されるメモを書くことができます。これらは、実行を検索するときにコマンドラインとGUIを介して表示可能になります。
コマンドラインインターフェイスには、他の機能もあります。 recipy --help
他のオプションを確認するためのヘルプ。差分を表示したり、特定の名前でファイルを作成したすべての実行、IDに基づいて検索、最新のエントリなどを表示できます。
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は、その構成とデータベース自体をすべて~/.recipy
に保存します。 Recistyのメイン構成ファイルは、 recipyrc
と呼ばれるこのフォルダー内にあります。構成ファイル形式は非常にシンプルで、Windows INIファイルに基づいています。構成ファイルを使用することは完全にオプションです。デフォルトは構成ファイルなしで正常に動作します。
構成の例は次のとおりです。
[ignored metadata]
diff
[general]
debug
これは、 git diff
情報を実行に関するメタデータを記録したときに保存しないようにレシピを指示するだけでなく、デバッグメッセージを印刷することもできます(特定の関数がパッチされていない理由を解決しようとする場合は本当に便利です)。現時点では、可能な唯一のオプションは次のとおりです。
[general]
debug
- デバッグメッセージを印刷しますeditor = vi
レシピのあるときに使用されるデフォルトのテキストエディタを構成して、メッセージを入力する必要があります。たとえば、Windows上にある場合はメモ帳を使用しますquiet
- メッセージを印刷しないでくださいport
- GUIに使用するポートを指定します[data]
file_diff_outputs
スクリプトが実行される前に出力ファイルが存在する場合、古い出力ファイルと新しい出力ファイルの間にdiffを保存します[database]
path = /path/to/file.json
データベースファイルにパスを設定します[ignored metadata]
diff
メタデータにgit diff
の出力をレシピの実行のために保存しないでくださいgit
メタデータにgit(origin、commit、repoなど)に関連するものを保存しないでください。input_hashes
入力ファイルのsha -1ハッシュを計算して保存しないでくださいoutput_hashes
出力ファイルのsha -1ハッシュを計算して保存しないでください[ignored inputs]
numpy
)、このモジュールからの入力を記録しないようにレシピを指示するか、 all
のモジュールからの入力を無視するように指示する[ignored outputs]
numpy
)、このモジュールからの出力を記録しないようにレシピを指示するか、 all
のモジュールからの出力を無視するように指示するデフォルトでは、すべてのメタデータが保存され(つまり、メタデータは無視されません)、デバッグメッセージは表示されません。 a .recipyrc
ファイル現在のディレクトリのファイルは~/.recipy/recipyrc
ファイルよりも優先され、プロジェクトごとの構成を簡単に処理できます。
注:デフォルトの構成ファイルにはレシピのあるものが提供されていないため、適切にフォーマットされたファイルを自分で作成するために必要なものを構成する場合はありません。
レシピをインポートすると、 sys.meta_path
に多くのクラスを追加します。これらは、モジュールのインポート手順の一部としてPythonによって使用されます。追加するクラスは、 PatchImporter
から派生したクラスであり、多くの場合、 PatchSimple
が提供するより簡単なインターフェイスを使用して、最初にレシピを呼び出す関数で入力/出力を実行する関数をラップすることができます。
一般に、ほとんどの複雑さはPatchImporter
とPatchSimple
(プラスutils.py
)に隠されているため、 numpy
などのモジュールをラップする実際のコードはかなり単純です。
# 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' )
このようなクラスは、入力/出力が記録する必要があるモジュールごとに実装する必要があります。現時点では、次の入力関数と出力関数にパッチが適用されます。
このテーブルには、モジュールのレシピがパッチのパッチとパッチされた出力関数がリストされています。
モジュール | 入力関数 | 出力関数 |
---|---|---|
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 Series.to_msgpack DataFrame.to_stata 、 DataFrame.to_pickle 、 Panel.to_excel 、 Panel.to_hdf 、 Panel.to_msgpack 、 Series.to_csv 、 Panel.to_pickle Series.to_hdf 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 spm99analyze.Spm99AnalyzeImage.from_filename nifti2.Nifti2Image.from_filename minc1.Minc1Image.from_filename freesurfer.mghformat.MGHImage.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 minc1.Minc1Image.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 |
ただし、上記のコードの例は、クラスを書くのが新しいモジュールをラップするのがどれほど簡単かを示しています。そのため、お気に入りの科学モジュールでレシピのように機能するためにプルリクエストを送信してください。
Recipyのテストフレームワークはintegration_test
にあります。テストフレームワークは、Python 2.7+とPython 3+の両方で実行されるように設計されています。詳細については、レシピのテストフレームワークを参照してください。
テストフレームワークは、次のプラットフォームで実行されます。