Как установить data_files пакета python в домашнюю директорию
Вот мой setup.py
setup(
name='shipane_sdk',
version='1.0.0.a5',
# ...
data_files=[(os.path.join(os.path.expanduser('~'), '.shipane_sdk', 'config'), ['config/scheduler-example.ini'])],
# ...
)
Команды упаковки и загрузки:
python setup.py sdist
python setup.py bdist_wheel --universal
twine upload dist/*
Установка команды:
pip install shipane_sdk
Но он не устанавливает config/scheduler-example.ini в ~/.shipane_sdk
Документы в пипсах говорят:
setuptools допускает абсолютные пути "data_files", и pip учитывает их как абсолютные при установке из sdist. Это не так при установке с колесных распределений. Колеса не поддерживают абсолютные пути, и в конечном итоге они устанавливаются относительно "пакетов сайтов". Для обсуждения см. Колесо № 92.
Вы знаете, как сделать установку из sdist?
1 ответ
Существует несколько способов решения этой проблемы, и все это сбивает с толку то, насколько несовместимы упаковочные инструменты. Некоторое время назад я обнаружил, что следующий обходной путь работает для меня лучше всего с sdist (обратите внимание, что он не работает с колесами!):
Вместо использования data_files, прикрепите файлы к вашему пакету, используя MANIFEST.in, который в вашем случае может выглядеть так:
include config/scheduler-example.ini
Скопируйте файлы "вручную" в выбранное место, используя этот фрагмент в файле setup.py:
if 'install' in sys.argv: from pkg_resources import Requirement, resource_filename import os import shutil # retrieve the temporary path where the package has been extracted to for installation conf_path_temp = resource_filename(Requirement.parse(APP_NAME), "conf") # if the config directory tree doesn't exist, create it if not os.path.exists(CONFIG_PATH): os.makedirs(CONFIG_PATH) # copy every file from given location to the specified ``CONFIG_PATH`` for file_name in os.listdir(conf_path_temp): file_path_full = os.path.join(conf_path_temp, file_name) if os.path.isfile(file_path_full): shutil.copy(file_path_full, CONFIG_PATH)
В моем случае "conf" был подкаталогом в пакете, который содержал мои файлы данных, и они должны были быть установлены в CONFIG_PATH, который был что-то вроде /etc/APP_NAME