Любая функция 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')