Sphinx Autosummary (Autodoc) частично импортирует модули

Sphinx autosummary/autodoc выдает ошибку для некоторых модулей, но не для всех.

Мой код с открытым исходным кодом: https://github.com/dream-faster/krisi

Я получаю следующую ошибку:

WARNING: autodoc: failed to import module 'metric'; the following exception was raised:
No module named 'metric'

WARNING: autodoc: failed to import module 'report'; the following exception was raised:
No module named 'report'

Он импортирует некоторые модули (например: compare.py), но не может импортировать другие (независимо от того, в каком подкаталоге они находятся).

Структура каталога:

library_name 
│
└───src
│   │
│   └───library_name
│         └─  __init__.py
│         │
│         └───module_1.py
│         │    └─   __init__.py
│         │    └─   compare.py
│         │    └─   report.py
│         │   
│         └───module_2.py
│              └─   __init__.py
│              └─   evaluate.py
│              └─   metric.py
│         
└───docs
    └───source
         └─   conf.py

Решения, которые я пробовал:

1. Указание пути (правда находит модуль частично)

Я пробовал все варианты добавления path к sys.path:

   current_dir = os.path.dirname(__file__)
   target_dir = os.path.abspath(os.path.join(current_dir, "../../src/project_name"))
   sys.path.insert(0, target_dir)
   sys.path.insert(0, os.path.abspath("../.."))
   sys.path.insert(0, os.path.abspath("../../src"))
   sys.path.insert(0, os.path.abspath("../../src/project_name"))
   for x in os.walk("../../src"):
       sys.path.append(x[0])

2. Проверяем, все ли зависимости установлены.

Я сделал новую чистую conda среду и установил свой пакет с pip install -e . Пройдены все тесты, охватывающие все модули.

3. Проверка, не является ли причиной кросс-модульный импорт

Некоторые модули ссылаются на другие модули, например: module_1.metric ссылки module_2.type Однако корректно импортированные модули делают то же самое без ошибок.

Что я упускаю из виду?

В каком контексте вы получаете ошибки импорта? Когда вы строите документ? С помощью какой команды (в каком каталоге)? Это может быть проблема с PATH. Кроме того, вы используете Conda исключительно для управления своей средой?

Lenormju 10.01.2023 07:45

Я заметил несоответствие в вашей структуре каталогов (library_name) и вашем sys.path (project_name). Однако похоже, что вы нашли и исправили проблему на github.com/dream-faster/krisi/commit/…

Steve Piercy 10.01.2023 09:35

Спасибо обоим за просмотр! - Я получаю ошибки импорта как локально, запустив make html в папке docs, так и в рабочем процессе github - я использую альтернативу conda (мамба), которая почти идентична. Я устанавливаю библиотеку с помощью pip install -e .

semyd 10.01.2023 17:50

Да, я по ошибке написал не тот код, но исправил

semyd 10.01.2023 17:51
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я обнаружил две проблемы, я не уверен, что вызвало проблему. Вероятно, это была комбинация того и другого, и, несмотря на то, что я пытался быть строгим, я не правильно понял комбинацию. Я методично удалял все файлы и добавлял их обратно один за другим.

  1. конфигурационный файл теперь:

sys.path.insert(0, os.path.abspath("../../src/project_name"))

  1. Нет относительного импорта ни в одном модуле

Я надеюсь, что это поможет кому-то другому.

Правильным решением будет использование виртуальных сред Python, в которых и ваш проект, и Sphinx установлены в одной и той же виртуальной среде. Обычному разработчику Python не должно быть необходимости тыкать sys.path.

Mikko Ohtamaa 19.01.2023 15:29

И мой проект, и Sphinx установлены в одной среде Python. Однако conf.py находится на два подкаталога ниже, поэтому не может найти каталог проекта.

semyd 19.01.2023 15:40

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