Как включить структуру родительских папок в дистрибутив библиотеки в Python 3.6 с помощью setuptools? - PullRequest
0 голосов
/ 02 сентября 2018

Я использую setuptools для распространения библиотеки Python. У меня есть следующая структура каталогов:

  /src
    /production
      setup.py
      /prod-library
        /package1
        /package2

Структура папок должна оставаться такой, потому что в будущем будет несколько библиотек, работающих под управлением src, и им нужны собственные файлы setup.py. Таким образом, традиционный ответ с наличием 1 родительской папки и перемещением файла setup.py в корневую папку в этом случае не будет работать.

Я использую следующее в файле setup.py библиотеки для экспорта библиотеки (которая работает)

    package_dir={'': '.'},
    packages=find_packages()

Внутри проекта tar.gz это выглядит так:

    /prod-library
      /package1
      /package2

Но внутри файлов Python пакета prod-библиотеки импорт, ссылающийся на другие модули, должен быть структурирован следующим образом:

    import src.production.prod-library.package1
    import src.production.prod-library.package2

Проблема: После импорта одной из этих библиотек в другой проект возникают следующие ошибки:

ModuleNotFoundError: No module named 'src.production'

Поскольку сборка выпадает только в пакете / prod-library, проект, импортирующий код, завершается сбоем из-за отсутствующей структуры папок (src / production), поскольку сборка имеет только /prod-library.

.

Что мне нужно сделать, так это включить папку src / production в сборку дистрибутива, чтобы результирующий файл tar.gz выглядел следующим образом:

   /src
     /production
       /prod-library
          /package1
          /package2

Я не уверен, как получить их в структуре сборки, так как они находятся выше расположения setup.py. Как это можно сделать?

Если это не так, тогда я открыт для предложений по исправлению импорта, если это может быть решением.

1 Ответ

0 голосов
/ 03 сентября 2018

Я нашел решение проблемы. Это связано с тем, как был настроен package_dir:

    package_dir={'': '.'}

Несмотря на то, что вышеуказанный package_dir создавал файлы и включал все подпапки, как и ожидалось, SOURCES.txt файла egg-info был неверным и отображал следующее:

    ./prod-library/__init__.py
    ./prod-library/package1/__init__.py
    etc...

Когда пакет был импортирован в другой API, при попытке импорта не удалось найти импорт prod-libary.package1.file.py

После изменения package_dir следующим образом я смог нормально использовать библиотеку:

    package_dir={'.': ''}

Вышесказанное эффективно удалило префикс ./ в файле SOURCES.txt, который нарушал импорт. Теперь SOURCES.txt для egg-info выглядит правильно:

    prod-library/__init__.py
    prod-library/package1/__init__.py
    etc...
...