상황을 상상해보십시오 : 당신은 출력으로 아름다운 그래프를 생성하는 멋진 파이썬 코드를 작성했습니다. graph.png
로 자연스럽게 그 그래프를 저장합니다. 작은 수정을 할 때마다 코드를 몇 번 실행합니다. 당신은 다음 주/월/년에 다시 돌아옵니다. 그 그래프를 어떻게 만들 었는지 아십니까? 어떤 입력 데이터? 코드의 어떤 버전? 당신이 나와 같은 사람이라면, 대답은 종종 실망스럽게도“아니오”가 될 것입니다. 물론, 당신은 당신이 그것을 만든 방법을 해결하려고 많은 시간을 낭비하거나, 당신에게 노벨상을 수상 할 저널 논문에서 그것을 포기하고 사용하지도 않습니다.
이 대화는이 상황에서 당신을 절약 할 수있는 파이썬 모듈 인 레시피 ( 레시피 및 파이썬 )를 소개합니다! (결과 논문이 노벨상을 수상 할 것이라고 보장 할 수는 없지만!) Python 파일의 상단에 단일 코드 라인을 추가하면 Recipy는 코드의 각 실행을 데이터베이스에 로그인하여 추적합니다. 입력 파일, 출력 파일 및 코드의 버전을 한 다음이 데이터베이스를 쿼리하여 실제로 graph.png
만드는 방법을 찾을 수 있습니다.
설치하는 가장 쉬운 방법은 단순히 실행하는 것입니다
pip install recipy
또는이 저장소를 복제하고 실행할 수 있습니다.
python setup.py install
의존성을 수동으로 설치하려면 (위의 지침을 따르는 경우 자동으로 설치해야 함) 실행하십시오.
pip install -r requirements.txt
실행을 통해 이전 릴리스에서 업그레이드 할 수 있습니다.
pip install -U recipy
마지막 릴리스 이후 변경된 점을 알아 보려면 Changelog를 참조하십시오.
참고 : Recepty의 이전 (발표되지 않은) 버전은 MongoDB를 설치하고 수동으로 설정해야했습니다. 순수한 Python 데이터베이스 (TinYDB)가 대신 사용되므로 더 이상 필요하지 않습니다. 또한 GUI는 이제 Recipy에 완전히 통합되어 별도로 설치할 필요가 없습니다.
파이썬 스크립트 상단에 다음 줄을 추가하기 만하면됩니다.
import recipy
다른 것을 가져 오기 전에 스크립트의 최상위 라인이어야 합니다 .
그런 다음 스크립트를 평소처럼 실행하면 모든 데이터가 TinyDB 데이터베이스에 로그인됩니다 (걱정하지 마십시오. 필요한 경우 데이터베이스가 자동으로 생성됩니다). 그런 다음 recipy
스크립트를 사용하여 데이터베이스를 신속하게 쿼리하여 출력 파일을 생성 한 코드의 실행을 찾을 수 있습니다. 예를 들어, 다음과 같은 코드를 실행하는 경우 다음과 같습니다.
import recipy
import numpy
arr = numpy . arange ( 10 )
arr = arr + 500
numpy . save ( 'test.npy' , arr )
(스크립트 시작시 import recipy
추가에 유의하십시오. 그러나 표준 스크립트의 다른 변경 사항은 없습니다).
또는 python -m recipy SCRIPT [ARGS ...]
가있는 수정되지 않은 스크립트를 실행하여 레시피 로깅을 활성화하십시오. 스크립트를 실행하기 전에 Recipy의 모듈 입력 지점을 호출합니다.
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
실행하면 브라우저 창이 모든 레시피 'runs'를 검색하는 데 사용할 수있는 인터페이스와 함께 열립니다.
내장 된 개방형으로 읽거나 쓰는 파일의 입력 및 출력을 기록하려면 조금 더 작업해야합니다. recipy.open
사용하거나 (스크립트 상단에서 import recipy
만하면), from recipy import open
추가하고 open
사용하십시오. 많은 라이브러리가 내부적으로 내장 된 내장을 사용하고 있으며 명시 적으로 열린 파일 만 기록하려고 하므로이 해결 방법이 필요합니다.
Python 2를 사용하는 경우 encoding
매개 변수를 recipy.open
으로 전달할 수 있습니다. 이 경우 codecs
적절한 인코딩으로 파일을 열는 데 사용됩니다.
데이터베이스에서 실행되면 데이터베이스를 '주석을 달라'할 수 있습니다. 이것은 잘 작동하는 녹음 또는 특정 문제를 기록하는 데 특히 유용 할 수 있습니다. 이것은 GUI의 '세부 사항'페이지에서 또는 실행하여 수행 할 수 있습니다.
recipy annotate
편집자를 열어 달리기에 첨부 될 메모를 쓸 수 있습니다. 그런 다음 실행을 검색 할 때 명령 줄과 GUI를 통해 볼 수 있습니다.
명령 줄 인터페이스에는 다른 기능도 있습니다 : recipy --help
다른 옵션을 볼 수 있습니다. Diffs를보고, 주어진 이름, 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의 기본 구성 파일은 recipyrc
라고하는이 폴더 내부에 있습니다. 구성 파일 형식은 매우 간단하며 Windows INI 파일을 기반으로하며 구성 파일을 갖는 것은 완전히 선택 사항입니다. 기본값은 구성 파일없이 잘 작동합니다.
예제 구성은 다음과 같습니다.
[ignored metadata]
diff
[general]
debug
이것은 실행에 대한 메타 데이터를 기록 할 때 git diff
정보를 저장하지 말고 디버그 메시지를 인쇄 할 때 레시피를 지시합니다 (특정 함수가 패치되지 않은 이유를 해결하려는 경우 실제로 유용 할 수 있음). 현재 가능한 유일한 옵션은 다음과 같습니다.
[general]
debug
- 디버그 메시지 인쇄editor = vi
수신기가 메시지를 입력해야 할 때 사용될 기본 텍스트 편집기를 구성합니다. 예를 들어 Windows에서 메모장을 사용하십시오quiet
- 메시지를 인쇄하지 마십시오port
- GUI에 사용할 포트를 지정하십시오[data]
file_diff_outputs
스크립트가 실행되기 전에 출력 파일이 존재하는 경우 기존 출력과 새 출력 파일간에 스토어 차이[database]
path = /path/to/file.json
데이터베이스 파일로의 경로 설정[ignored metadata]
diff
수리 실행에 대한 메타 데이터에 git diff
의 출력을 저장하지 마십시오.git
수리 실행에 대한 메타 데이터에서 git (Origin, Commit, Repo 등)와 관련된 것을 저장하지 마십시오.input_hashes
output_hashes
출력 파일의 SHA -1 해시를 계산하고 저장하지 마십시오.[ignored inputs]
numpy
)을 나열하여 수신기 가이 모듈에서 입력을 기록하지 않도록 지시하거나 모든 모듈의 입력을 무시하도록 all
합니다.[ignored outputs]
numpy
)을 나열하여 레시피 가이 모듈에서 출력을 기록하지 않도록 지시하거나 모든 모듈의 출력을 무시하도록 all
합니다. 기본적으로 모든 메타 데이터가 저장되어 (예 : 메타 데이터가 무시되지 않음) 디버그 메시지가 표시되지 않습니다. 현재 디렉토리의 .recipyrc
파일은 ~/.recipy/recipyrc
파일보다 우선하여 프로젝트 별 구성을 쉽게 처리 할 수 있습니다.
참고 : 기본 구성 파일에는 레시피가 제공되지 않으므로 구성하려면 적절하게 형성 된 파일을 직접 작성해야합니다.
Recepy를 가져 오면 sys.meta_path
에 여러 클래스를 추가합니다. 그런 다음 파이썬에서 모듈의 가져 오기 절차의 일부로 사용됩니다. 우리가 추가하는 클래스는 PatchImporter
에서 파생 된 클래스이며, 종종 PatchSimple
에서 제공하는 쉬운 인터페이스를 사용하여 Recipy를 호출하여 정보를 가장 먼저 호출하는 함수에서 입력/출력을하는 기능을 랩핑 할 수 있습니다.
일반적으로 대부분의 복잡성은 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_csv DataFrame.to_stata , DataFrame.to_pickle , Panel.to_excel , Panel.to_hdf , Panel.to_msgpack , 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 , nifti2.Nifti2Image.from_filename , freesurfer.mghformat.MGHImage.from_filename , spm99analyze.Spm99AnalyzeImage.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 minc2.Minc2Image.to_filename minc1.Minc1Image.to_filename analyze.AnalyzeImage.to_filename , parrec.PARRECImage.to_filename , spm2analyze.Spm2AnalyzeImage.to_filename |
그러나 위의 코드 예제는 새로운 모듈을 래핑하기 위해 클래스를 작성하는 것이 얼마나 쉬운 지 보여줍니다. 따라서 좋아하는 과학 모듈과 함께 수신자가 작동하도록 풀 요청을 제출하십시오!
Recipy의 테스트 프레임 워크는 integration_test
에 있습니다. 테스트 프레임 워크는 Python 2.7+ 및 Python 3+에서 실행되도록 설계되었습니다. 자세한 내용은 Recepy Test Framework를 참조하십시오.
테스트 프레임 워크는 다음 플랫폼에서 실행됩니다.