Как установить 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 (обратите внимание, что он не работает с колесами!):

  1. Вместо использования data_files, прикрепите файлы к вашему пакету, используя MANIFEST.in, который в вашем случае может выглядеть так:

    include config/scheduler-example.ini
    
  2. Скопируйте файлы "вручную" в выбранное место, используя этот фрагмент в файле 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

Другие вопросы по тегам