Вариант 1. Установка в качестве данных пакета
Основное преимущество размещения файлов данных внутри корня пакета Python состоит в том, что он позволяет избежать беспокойства о том, где будут храниться файлы.пользовательская система, которая может быть Windows, Mac, Linux, какой-либо мобильной платформой или внутри Egg.Вы всегда можете найти каталог data
относительно корня вашего пакета Python, независимо от того, где и как он установлен.
Например, если у меня есть макет проекта, подобный так:
project/
foo/
__init__.py
data/
resource1/
foo.txt
Вы можете добавить функцию к __init__.py
, чтобы найти абсолютный путь к файлу данных:
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')
Выходы:
/Users/pat/project/foo/data/resource1/foo.txt
После того, как проект установлен как Egg,путь к data
изменится, но код менять не нужно:
/Users/pat/virtenv/foo/lib/python2.6/site-packages/foo-0.0.0-py2.6.egg/foo/data/resource1/foo.txt
Вариант 2. Установка в фиксированном месте
альтернативой может быть размещение ваших данных вне пакета Python, а затем либо:
- передать местоположение
data
через файл конфигурации, аргументы командной строки или - Embed theрасположение в вашем коде Python.
Это гораздо менее желательно, если вы планируете распространять свой проект.Если вы действительно хотите это сделать, вы можете установить data
в любом месте целевой системы, указав место назначения для каждой группы файлов, передав список кортежей:
from setuptools import setup
setup(
...
data_files=[
('/var/data1', ['data/foo.txt']),
('/var/data2', ['data/bar.txt'])
]
)
Обновлено : Пример функции оболочки для рекурсивного поиска файлов Python:
atlas% function grep_py { find . -name '*.py' -exec grep -Hn $* {} \; }
atlas% grep_py ": \["
./setup.py:9: package_data={'foo': ['data/resource1/foo.txt']}