Любая функция Python, чтобы получить корневой каталог "data_files"?

Это должно быть очень распространенным вопросом для разработчиков, которые использовали "setup.py" для сборки инсталляционных пакетов, и его нужно задавать раньше, но я нигде не смог найти правильный ответ.

В setup.py

from distutils.core import setup
setup(
    ....,
    ....,
    data_files=[('MyApp/CBV', ['myapp/data/CBV/training.cbv', 'myapp/data/CBV/test.cbv'])],
    ....,
    ....,
    )

Результат установки sudo python setup.py

running install
running build
running build_py
running build_scripts
running install_lib
running install_scripts
running install_data
creating /usr/local/MyApp/CBV
copying MyApp/data/CBV/training.cbv -> /usr/local/MyApp/CBV
copying MyApp/data/CBV/test.cbv -> /usr/local/MyApp/CBV
running install_egg_info
Removing /usr/local/lib/python2.7/dist-packages/MyApp-0.1.0.egg-info
Writing /usr/local/lib/python2.7/dist-packages/MyApp-0.1.0.egg-info

Из наблюдения, использующего приведенный выше результат, "/ usr / local" является корневым каталогом "data_files". Кроме жесткого кодирования, есть ли функции Python, которые могут дать мне этот корневой каталог "data_files"?

С предложением от Martijn Pieters, вот мое решение

В setup.py

from setuptools import setup
setup(
    ....,
    ....,
    package=['myapp'],
    package_data={'': ['data/CBV/*.cbv']},
    ....,
    ....,
    )

использование

import pkg_resources

my_data_file = pkg_resources.resource_filename(__name__, 'data/CBV/test.cbv')
print my_data_file

1 ответ

Решение

По умолчанию при установке пакета от имени root относительные имена каталогов в data_files список разрешается в зависимости от значения sys.prefix (для библиотек на чистом питоне) или sys.exec_prefix (для библиотек с скомпилированным расширением), поэтому вы можете извлекать ваши файлы на основе этого. Qouting от distutils документация:

Если каталог является относительным путем, он интерпретируется относительно префикса установки (Python sys.prefix для пакетов на чистом Python, sys.exec_prefix для пакетов, которые содержат модули расширения).

Так что для вашего примера вы найдете ваши файлы в os.path.join(sys.prefix, 'MyApp', 'CBV'),

Тем не менее, вам будет лучше использовать setuptools расширение до distutils и использовать pkg_resources Модуль Resource API для загрузки файлов данных. Идет с setuptools для этой цели. Вы хотите, чтобы ваши файлы данных, включенные в пакет, работали лучше всего. См. Включение файлов данных в документацию по setuptools.

Затем вы можете загрузить файлы ресурсов прямо в строку с resource_string например:

from pkg_resources import resource_string

foo_config = resource_string(__name__, 'foo.conf')
Другие вопросы по тегам