Создание пакета python для PIP с некоторыми файлами data_files

#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 для пакетов с чистым Python sys.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. Это уже есть в манифесте, и файлы собираются, но в неправильной папке.