Imagine a situação: você escreveu um código python maravilhoso que produz um belo gráfico como uma saída. Você salva esse gráfico, naturalmente, como graph.png
. Você executa o código algumas vezes, sempre fazendo pequenas modificações. Você volta a ele na próxima semana/mês/ano. Você sabe como você criou esse gráfico? Quais dados de entrada? Qual versão do seu código? Se você é como eu, a resposta com frequência, frustrantemente, seja "não". Obviamente, você perde muito tempo tentando descobrir como criou, ou mesmo desiste e nunca o usa naquele jornal do diário que ganhará um prêmio Nobel ...
Esta palestra introduzirá receptores (da receita e Python ), um módulo Python que o salvará dessa situação! (Embora não possa garantir que seu artigo resultante ganhe um prêmio Nobel!) Com a adição de uma única linha de código à parte superior dos seus arquivos Python, Retire registrará cada execução de seu código em um banco de dados, acompanhando Os arquivos de entrada, os arquivos de saída e a versão do seu código e, em seguida, permitem consultar este banco de dados para descobrir como você realmente criou graph.png
.
A maneira mais fácil de instalar é simplesmente executando
pip install recipy
Como alternativa, você pode clonar este repositório e executar:
python setup.py install
Se você deseja instalar as dependências manualmente (elas devem ser instaladas automaticamente se você estiver seguindo as instruções acima), execute:
pip install -r requirements.txt
Você pode atualizar de um lançamento anterior executando:
pip install -U recipy
Para descobrir o que mudou desde o último lançamento, consulte o Changelog
NOTA: Versões anteriores (não lançadas) do RetiBy exigiam que o MongoDB fosse instalado e configurado manualmente. Isso não é mais necessário, pois um banco de dados python puro (TinyDB) é usado. Além disso, a GUI agora está integrada totalmente à recepção e não requer a instalação separadamente.
Basta adicionar a seguinte linha ao topo do seu script Python:
import recipy
Observe que essa deve ser a linha superior do seu script, antes de importar qualquer outra coisa.
Em seguida, basta executar seu script como de costume e todos os dados serão conectados ao banco de dados TinyDB (não se preocupe, o banco de dados é criado automaticamente, se necessário). Em seguida, você pode usar o script recipy
para consultar rapidamente o banco de dados para descobrir qual execução do seu código produziu qual arquivo de saída. Por exemplo, se você executar algum código como este:
import recipy
import numpy
arr = numpy . arange ( 10 )
arr = arr + 500
numpy . save ( 'test.npy' , arr )
(Observe a adição de import recipy
no início do script - mas não há outras alterações de um script padrão)
Como alternativa, execute um script não modificado com python -m recipy SCRIPT [ARGS ...]
para ativar o registro recipiente. Isso chama o ponto de entrada do módulo recibo, que cuida da importação para você, antes de executar seu script.
produzirá uma saída chamada test.npy
. Para descobrir os detalhes da corrida que criou este arquivo que você pode pesquisar usando
recipy search test.npy
E exibirá informações como as seguintes:
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
Uma maneira alternativa de ver isso é usar a GUI. Basta executar recipy gui
e uma janela do navegador será aberta com uma interface que você pode usar para pesquisar todas as suas 'execuções' recínculadas:
Se você deseja registrar entradas e saídas de arquivos lidos ou escritos com aberto, precisará fazer um pouco mais de trabalho. Use recipy.open
(requer apenas import recipy
na parte superior do seu script) ou adicione from recipy import open
e apenas use open
. Essa solução alternativa é necessária, porque muitas bibliotecas usam abertos internos internos e você deseja gravar apenas os arquivos que você se abriu explicitamente.
Se você usar o Python 2, poderá passar um parâmetro encoding
para recipy.open
. Nesse caso, codecs
é usado para abrir o arquivo com a codificação adequada.
Depois de obter algumas corridas no seu banco de dados, você pode 'anotar' essas corridas com todas as anotações que deseja manter sobre elas. Isso pode ser particularmente útil para gravar quais execuções funcionaram bem ou problemas particulares que você encontrou. Isso pode ser feito na página 'Detalhes' na GUI, ou executando
recipy annotate
que abrirá um editor para permitir que você escreva notas que serão anexadas à corrida. Estes serão visíveis através da linha de comando e da GUI ao procurar por execuções.
Também existem outros recursos na interface da linha de comando: recipy --help
para ver as outras opções. Você pode visualizar diffs, consulte todas as execuções que criaram um arquivo com um determinado nome, pesquisar com base nos IDs, mostrar a entrada mais recente e mais:
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
Retorno armazena toda a sua configuração e o próprio banco de dados em ~/.recipy
. O arquivo de configuração principal do recipiente está dentro desta pasta, chamado recipyrc
. O formato do arquivo de configuração é muito simples e é baseado nos arquivos do Windows INI - e ter um arquivo de configuração é completamente opcional: os padrões funcionarão bem sem arquivo de configuração.
Um exemplo de configuração é:
[ignored metadata]
diff
[general]
debug
Isso simplesmente instrui o GILL a não salvar informações git diff
quando registra metadados sobre uma execução e também a imprimir mensagens de depuração (que podem ser realmente úteis se você estiver tentando descobrir por que certas funções não são corrigidas). No momento, as únicas opções possíveis são:
[general]
debug
- Mensagens de depuração impressaeditor = vi
- Configure o editor de texto padrão que será usado quando o recibo precisar que você digite uma mensagem. Use o bloco de notas se no Windows, por exemploquiet
- não imprima nenhuma mensagemport
- especifique a porta para usar para a GUI[data]
file_diff_outputs
- Armazene Diff entre a saída antiga e o novo arquivo de saída, se o arquivo de saída existir antes que o script seja executado[database]
path = /path/to/file.json
- defina o caminho para o arquivo de banco de dados[ignored metadata]
diff
- Não armazene a saída de git diff
nos metadados para uma corrida recíriagit
- Não armazene nada relacionado a Git (Origin, Commit, Repo etc) nos metadados para uma corrida recíriainput_hashes
- Não calcule e armazene hashes sha -1 de arquivos de entradaoutput_hashes
- Não calcule e armazene hashes sha -1 de arquivos de saída[ignored inputs]
numpy
) para instruir a recibo a não registrar entradas deste módulo, ou all
para ignorar as entradas de todos os módulos[ignored outputs]
numpy
) para instruir o recipiente a não registrar saídas deste módulo, ou all
para ignorar as saídas de todos os módulos Por padrão, todos os metadados são armazenados (por exemplo, nenhum metadado é ignorado) e as mensagens de depuração não são mostradas. Um arquivo .recipyrc
no diretório atual tem precedência sobre o arquivo ~/.recipy/recipyrc
, permitindo que as configurações por projeto sejam manipuladas facilmente.
NOTA: Nenhum arquivo de configuração padrão é fornecido com o Retify; portanto, se você deseja configurar qualquer coisa, você precisará criar um arquivo de formato adequado.
Quando você importa, ele adiciona várias classes ao sys.meta_path
. Estes são então usados pelo Python como parte do procedimento de importação para módulos. As classes que adicionamos são classes derivadas do PatchImporter
, geralmente usando a interface mais fácil fornecida pelo PatchSimple
, que nos permite envolver funções que fazem entrada/saída em uma função que chama a recibo primeiro para registrar as informações.
Geralmente, a maior parte da complexidade está escondida em PatchImporter
e PatchSimple
(mais utils.py
); portanto, o código real para envolver um módulo, como numpy
é bastante simples:
# 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' )
Uma classe como essa deve ser implementada para cada módulo cuja entrada/saída precisa de registro. No momento, as seguintes funções de entrada e saída são corrigidas:
Esta tabela lista os módulos recusados para os patches e as funções de entrada e saída que são corrigidas.
Módulo | Funções de entrada | Funções de saída |
---|---|---|
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 , Panel.to_msgpack , Panel.to_pickle , Series.to_csv , 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 , minc1.Minc1Image.to_filename , minc2.Minc2Image.to_filename , analyze.AnalyzeImage.to_filename , parrec.PARRECImage.to_filename , spm2analyze.Spm2AnalyzeImage.to_filename |
No entanto, o exemplo de código acima mostra como é fácil escrever uma classe para embrulhar um novo módulo - então, por favor, sinta -se à vontade para enviar uma solicitação de tração para fazer trabalhar com seus módulos científicos favoritos!
A estrutura de teste da RECLING está em integration_test
. A estrutura de teste foi projetada para ser executada no Python 2.7+ e no Python 3+. Para obter mais informações, consulte a estrutura de teste recipiente.
A estrutura de teste é executada nas seguintes plataformas: