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 datarelativo à 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:
project/
foo/
__init__.py
data/
resource1/
foo.txt
Você pode adicionar uma função para __init__.pylocalizar um caminho absoluto para um arquivo de dados:
import os
_ROOT = os.path.abspath(os.path.dirname(__file__))
def get_data(path):
return os.path.join(_ROOT, 'data', path)
print get_data('resource1/foo.txt')
Saídas:
/Users/pat/project/foo/data/resource1/foo.txt
Depois que o projeto for instalado como um Egg, o caminho para dataserá alterado, mas o código não precisa ser alterado:
/Users/pat/virtenv/foo/lib/python2.6/site-packages/foo-0.0.0-py2.6.egg/foo/data/resource1/foo.txt
Opção 2: instalar em local fixo
A alternativa seria colocar seus dados fora do pacote Python e então:
- Ter a localização
datatransmitida por meio de um arquivo de configuração, argumentos de linha de comando ou
- Incorpore o local em seu código Python.
Isso é muito menos desejável se você planeja distribuir seu projeto. Se você realmente quiser fazer isso, você pode instalar dataonde quiser no sistema de destino, especificando o destino para cada grupo de arquivos, passando uma lista de tuplas:
from setuptools import setup
setup(
...
data_files=[
('/var/data1', ['data/foo.txt']),
('/var/data2', ['data/bar.txt'])
]
)
Atualizado : exemplo de uma função shell para executar grep recursivamente em arquivos Python:
atlas% function grep_py { find . -name '*.py' -exec grep -Hn $* {} \; }
atlas% grep_py ": \["
./setup.py:9: package_data={'foo': ['data/resource1/foo.txt']}