Представьте себе ситуацию: вы написали какой -то замечательный код Python, который производит красивый график в качестве вывода. Вы сохраняете этот график, естественно, как graph.png
. Вы запускаете код пару раз, каждый раз делая незначительные изменения. Вы возвращаетесь к этому на следующей неделе/месяц/год. Вы знаете, как вы создали этот график? Какие входные данные? Какая версия вашего кода? Если вы что -то похожи на меня, то ответ часто будет, разочаровывающим, будьте «нет». Конечно, вы затем тратите много времени, пытаясь понять, как вы его создали, или даже сдаться и никогда не использовать его в этой журнальной газете, которая принесет вам Нобелевскую премию ...
В этом выступлении будет представлен рецепт (от рецепта и питона ), модуля Python, который спасет вас от этой ситуации! (Хотя это не может гарантировать, что ваша полученная статья выиграет Нобелевскую премию!) С добавлением одной строки кода в верхнюю часть ваших файлов Python, Recety будет регистрировать каждый запуск вашего кода в базу данных, отслеживая Входные файлы, выходные файлы и версия вашего кода, а затем позвольте вам запросить эту базу данных, чтобы узнать, как вы действительно создали graph.png
.
Самый простой способ установить - просто запустить
pip install recipy
В качестве альтернативы, вы можете клонировать этот репозиторий и запустить:
python setup.py install
Если вы хотите установить зависимости вручную (они должны быть установлены автоматически, если вы следуете инструкциям выше), затем запустите:
pip install -r requirements.txt
Вы можете обновиться с предыдущего релиза, работая:
pip install -U recipy
Чтобы узнать, что изменилось с момента последнего релиза, см. Чанглог
ПРИМЕЧАНИЕ. Предыдущие (не выпущенные) версии Recey, требуемые MongoDB для установки и установки вручную. Это больше не требуется, так как вместо этого используется база данных Pure Python (tinydb). Кроме того, графический интерфейс теперь полностью интегрирован в рецепт и не требует установки отдельно.
Просто добавьте следующую строку в верхнюю часть вашего сценария Python:
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 ...]
чтобы включить регистрацию ре же. Это вызывает точку входа модуля Receation, которая заботится о импорте для вас, прежде чем запустить ваш сценарий.
Он создаст выходной сигнал 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
Альтернативный способ просмотреть это - использовать графический интерфейс. Просто запустите recipy gui
, и окно браузера откроется с интерфейсом, который вы можете использовать для поиска всех ваших рецептов «прогонов»:
Если вы хотите войти в систему входов и выходов файлов, считываемых или написанных со встроенным открытым, вам нужно сделать немного больше работы. Либо используйте recipy.open
(требует только import recipy
в верхней части вашего сценария), либо добавьте from recipy import open
и просто open
. Этот обходной путь требуется, потому что многие библиотеки используют встроенный открытый внутри, и вы хотите только записать файлы, которые вы явно открыли себя.
Если вы используете Python 2, вы можете передать параметр encoding
recipy.open
. В этом случае codecs
используются для открытия файла с правильным кодированием.
После того, как вы получите несколько пробежек в вашей базе данных, вы можете «аннотировать» эти пробежки с любыми заметками, которые вы хотите сохранить в них. Это может быть особенно полезно для записи, которая работает хорошо, или особые проблемы, с которыми вы столкнулись. Это можно сделать со страницы «Подробности» в графическом интерфейсе или с помощью запуска
recipy annotate
который откроет редактор, чтобы позволить вам писать заметки, которые будут прикреплены к пробегу. Затем они будут просмотреть через командную линию и графический интерфейс при поиске запуска.
В интерфейсе командной строки есть и другие функции: recipy --help
чтобы увидеть другие варианты. Вы можете просмотреть Diffs, см. Все запуска, которые создали файл с данным именем, поиск на основе идентификаторов, покажите последнюю запись и многое другое:
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
Recey сохраняет всю свою конфигурацию и саму базу данных в ~/.recipy
. Основной файл конфигурации Recey находится внутри этой папки, называемой recipyrc
. Формат файла конфигурации очень прост и основан на файлах Windows INI - и наличие файла конфигурации является совершенно необязательным: по умолчанию будут работать нормально без файла конфигурации.
Примером конфигурации является:
[ignored metadata]
diff
[general]
debug
Это просто инструктирует Recey не сохранять информацию git diff
, когда записывает метаданные о пробеге, а также печатать сообщения отладки (которые могут быть действительно полезными, если вы пытаетесь понять, почему определенные функции не исправлены). На данный момент единственные возможные варианты:
[general]
debug
- печатные сообщения отладкиeditor = vi
- Настройте текстовый редактор по умолчанию, который будет использоваться, когда Recey нуждается в том, чтобы ввести сообщение. Используйте блокнот, если в Windows, например,quiet
- не печатайте никаких сообщенийport
- указать порт для использования для графического интерфейса[data]
file_diff_outputs
- хранить Diff между старым выводом и новым выходным файлом, если выходной файл существует до выполнения скрипта[database]
path = /path/to/file.json
- установите путь в файл базы данных[ignored metadata]
diff
- не храните выход git diff
в метаданныхgit
- не храните ничего, касающееся Git (Origin, Commit, Repo и т. Д.)input_hashes
- не вычислите и не храните хэши входных файлов SHA -1output_hashes
- не вычислите и не храните хэши вывода SHA -1[ignored inputs]
numpy
), чтобы поручить рецепту не записывать входы из этого модуля или all
, чтобы игнорировать входы из всех модулей[ignored outputs]
numpy
), чтобы поручить Recey не записывать выходы из этого модуля или all
, чтобы игнорировать выходы из всех модулей По умолчанию все метаданные хранятся (т. Е. Никаких метаданных не игнорируются), а отладочные сообщения не отображаются. Файл .recipyrc
в текущем каталоге имеет приоритет над файлом ~/.recipy/recipyrc
, что позволяет легко обрабатывать конфигурации для каждого проекта.
Примечание. Файл конфигурации по умолчанию не предоставлен с рецептом, поэтому, если вы хотите настроить все, что вам понадобится для создания правильноформатированного файла самостоятельно.
Когда вы импортируете Recey, он добавляет несколько классов в sys.meta_path
. Затем они используются Python как часть процедуры импорта для модулей. Классы, которые мы добавляем, - это классы, полученные от PatchImporter
, часто используя более простой интерфейс, предоставляемый PatchSimple
, который позволяет нам обернуть функции, которые выполняют ввод/вывод в функцию, которая сначала вызывает Recey для регистрации информации.
Как правило, большая часть сложности скрыта в 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 , DataFrame.to_stata , DataFrame.to_pickle , Panel.to_excel , Panel.to_hdf Series.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.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.tinimage, minc1.filemage, minc2.Minc2Image.to_filename . analyze.AnalyzeImage.to_filename , parrec.PARRECImage.to_filename , spm2analyze.Spm2AnalyzeImage.to_filename |
Тем не менее, приведенный выше пример кода показывает, как легко написать класс, чтобы обернуть новый модуль - поэтому, пожалуйста, не стесняйтесь отправлять запрос на привлечение, чтобы сделать репутацию с вашими любимыми научными модулями!
РЕБКОЙ ТЕСТРЕВЕННЫЙ ПРИМЕР В integration_test
. Тестовая структура была разработана для запуска под Python 2.7+ и Python 3+. Для получения дополнительной информации см. Регистрированную структуру тестирования.
Тестовая структура запускается на следующих платформах: