Eu uso setuptools para distribuir meu pacote python. Agora preciso distribuir arquivos de dados adicionais.
Pelo que reuni da documentação do setuptools, preciso ter meus arquivos de dados dentro do diretório do pacote. No entanto, prefiro ter meus arquivos de dados dentro de um subdiretório no diretório raiz.
O que eu gostaria de evitar:
/ #root
|- src/
| |- mypackage/
| | |- data/
| | | |- resource1
| | | |- [...]
| | |- __init__.py
| | |- [...]
|- setup.py
O que eu gostaria de ter em vez disso:
/ #root
|- data/
| |- resource1
| |- [...]
|- src/
| |- mypackage/
| | |- __init__.py
| | |- [...]
|- setup.py
Eu simplesmente não me sinto confortável em ter tantos subdiretórios, se não for essencial. Não consigo encontrar um motivo pelo qual eu / tenho / para colocar os arquivos dentro do diretório do pacote. Também é complicado trabalhar com tantos subdiretórios IMHO aninhados. Ou há algum bom motivo que justifique essa restrição?
python
setuptools
phant0m
fonte
fonte
__init__.py
arquivo, mesmo se esse arquivo estiver em branco. Portanto, você pode manter um diretório de dados separado com um__init__.py
arquivo vazio para fazer com que pareça um pacote. Isso deve evitar que o grep de sua árvore de origem os pegue, mas ainda será reconhecido como um pacote pelo python e suas ferramentas de construção.Respostas:
Opção 1: instalar como dados do pacote
A principal vantagem de colocar arquivos de dados dentro da raiz de seu pacote Python é que isso permite que você evite se preocupar com onde os arquivos ficarão no sistema de um usuário, que pode ser Windows, Mac, Linux, alguma plataforma móvel ou dentro de um Egg. Você sempre pode encontrar o diretório
data
relativo à raiz do seu pacote Python, não importa onde ou como ele está instalado.Por exemplo, se eu tiver um layout de projeto como este:
Você pode adicionar uma função para
__init__.py
localizar um caminho absoluto para um arquivo de dados:Saídas:
Depois que o projeto for instalado como um Egg, o caminho para
data
será alterado, mas o código não precisa ser alterado:Opção 2: instalar em local fixo
A alternativa seria colocar seus dados fora do pacote Python e então:
data
transmitida por meio de um arquivo de configuração, argumentos de linha de comando ouIsso é muito menos desejável se você planeja distribuir seu projeto. Se você realmente quiser fazer isso, você pode instalar
data
onde quiser no sistema de destino, especificando o destino para cada grupo de arquivos, passando uma lista de tuplas:Atualizado : exemplo de uma função shell para executar grep recursivamente em arquivos Python:
fonte
data_files
. Além disso, você pode criar um alias de shell para grep para ignorar arquivos não-Python, algo comogrep_py
.Acho que encontrei um bom compromisso que lhe permitirá manter a seguinte estrutura:
Você deve instalar os dados como package_data, para evitar os problemas descritos na resposta samplebias, mas para manter a estrutura do arquivo você deve adicionar ao seu setup.py:
Desta forma criamos a estrutura apropriada "just in time", e mantemos nossa árvore de origem organizada.
Para acessar esses arquivos de dados dentro do seu código, você "simplesmente" usa:
data = resource_filename(Requirement.parse("main_package"), 'mypackage/data')
Ainda não gosto de ter que especificar 'mypackage' no código, pois os dados não podem ter nada a ver necessariamente com este módulo, mas acho que é um bom compromisso.
fonte
Eu acho que você pode basicamente fornecer qualquer coisa como argumento * data_files * para setup () .
fonte