#python #package #distutils #pip #data-files
#python #пакет #distutils #pip #файлы данных
Вопрос:
Я делаю проект с таким макетом:
project/
bin/
my_bin.py
CHANGES.txt
docs/
LICENSE.txt
README.txt
MANIFEST.in
setup.py
project/
__init__.py
some_thing.py
default_data.json
other_datas/
default/
other_default_datas.json
И проблема в том, что когда я устанавливаю это с помощью pip, он помещает папку «default_data.json» и «other_datas» не в то же место, что и остальная часть приложения.
Как я должен сделать, чтобы они были в одном и том же месте?
Они заканчиваются в «/ home/ user /.virtualenvs / proj-env / project»
вместо «/home/user/.virtualenvs/proj-env/lib/python2.6/site-packages /project»
В setup.py Я делаю это вот так:
inside_dir = 'project'
data_folder= os.path.join(inside_dir,'other_datas')
data_files = [(inside_dir, [os.path.join(inside_dir,'default_data.json')])]
for dirpath, dirnames, filenames in os.walk(data_folder):
data_files.append([dirpath, [os.path.join(dirpath, f) for f in filenames]])
Ответ №1:
Из https://docs.python.org/3.4/distutils/setupscript.html#installing-additional-files:
Если каталог является относительным путем, он интерпретируется относительно установочного префикса (Python
sys.prefix
для пакетов с чистым Pythonsys.exec_prefix
, для пакетов, содержащих модули расширения).Каждое имя файла в файлах интерпретируется относительно
setup.py
скрипта в верхней части исходного дистрибутива пакета.
Итак, описанное поведение — это просто способ data_files
работы.
Если вы хотите включить файлы данных в свой пакет, вам нужно использовать package_data
вместо:
package_data={'project': ['default_data.json', 'other_datas/default/*.json']}
Комментарии:
1. Невозможно использовать package_data, если файл находится вне корня пакета (что может произойти, например, если ваш пакет находится внутри ‘src’, но вы хотите добавить файл вне его). Нет ли способа использовать data_files для перехода в пакет?
Ответ №2:
Взгляните на этот пакет https://pypi.python.org/pypi/datafolder . Это упрощает установку и использование (файлы данных: * .conf, * .ini * .db, …) вашим пакетом и пользователем.
Комментарии:
1. Этот пакет испортил мою сборку и потратил впустую мое время. Возможно, небольшое изменение здесь и там может решить проблему, но я не могу рекомендовать использовать его другим.
Ответ №3:
Измените свой MANIFEST.in
, чтобы включить их .json
.
Вероятно, это сработает:
recursive-include project/ *.json
Комментарии:
1. Это уже есть в манифесте, и файлы собираются, но в неправильной папке.