Сфинкс не может найти модуль, но Python может

#python #python-sphinx #autodoc #sphinx-apidoc

Вопрос:

Sphinx, генератор документации Python, похоже, не понимает моих модулей/пакетов. Вкл make clean amp;amp; make html ., когда выполняется этот код: from statstuff import statistics as stats , он выводит:

ImportError: Нет модуля с именем «statstuff»

Я также попытался ссылаться на модуль как from . import statistics as stats , так как модули находятся в одном пакете, но выводит Sphinx:

Ошибка системы: Родительский модуль » не загружен, не может выполнить относительный импорт

Кроме того, config.py кажется , что он правильно настроен как sys.path.insert(0, os.path.abspath('../statstuff/')) , учитывая, что папка документации совместно использует свою родительскую папку с папкой statstuff.

Во всяком случае, вот хранилище с файлами: https://github.com/lucasmauro/statstuff

Проблема возникает в statstuff/regression.py строках 2 и 3: https://github.com/lucasmauro/statstuff/blob/master/statstuff/regression.py

Код обычно выполняется с интерпретаторами Python, но Sphinx не удается найти модуль в том виде, в каком был написан код (или конфигурация).

У кого-нибудь есть подсказка, как это решить?

Действительно, большое вам спасибо!

Ответ №1:

Поскольку ваши модули находятся в пакете под названием statstuff , я предлагаю следующее:

  1. Добавьте путь к каталогу выше statstuff , чтобы sys.path в conf.py:
     sys.path.insert(0, os.path.abspath('..'))
     
  2. Отредактируйте automodule директивы. Изменить
     .. automodule:: probability 
     

    Для

     .. automodule:: statstuff.probability
     

    и так далее.

Комментарии:

1. mzjn, большое вам спасибо. Это сработало, но вроде как. Все было помещено в «statstuff» на странице документации. У вас есть какие-нибудь другие идеи?

2. «Все было внутри «statstuff» на странице документации» . Это проблема? Вы поместили свои модули в пакет, который называется statstuff , и это должно быть отражено в документации, не так ли?

3. Я не уверен, что это то, что вы хотите, но вы могли бы попытаться установить переменную конфигурации False add_module_names в значение . Это приведет к удалению statstuff.<modname> всех имен функций.

4. Моя первоначальная идея состояла в том, что статусом пакета будет корень, такой как «src», и модули или пакеты внутри него (и тесты вне «src»). Но я очень новичок в Python, поэтому мой дизайн не очень хорош, хе-хе. Таким образом, установка sys.path.insert(0, os.path.abspath(‘..’)) работает со всеми модулями, так что все в порядке. Я думаю, мне действительно не нужно рассматривать «statstuff» как корень документации, в конце концов, это не имеет большого значения. Большое спасибо, @mzjn. 🙂