Ошибка импорта ReadTheDocs из __init__.py

У меня проблемы с readdhedocs autodocs - сборка завершена, но моя документация пуста для каждого класса.

Глядя на информацию о сборке, кажется, что получает синтаксическую ошибку, которая вызывает несколько предупреждений:

print(clean_sample, file=open(new_fname, 'w'))

Тем не менее, это совсем не похоже на ошибку.

Вот информация о сборке https://readthedocs.org/projects/medembed/builds/7108142/

Моя файловая структура:

MedEmbed/
  docs/
    build/
    source/
      code.rst
      conf.py
      index.rst
  medembed/
    __init.py
    main.py
    transformer.py
    dataset.py
    embedding.py

Как таковой, я добавил в conf.py:

sys.path.insert(0, os.path.abspath('../../medembed'))

Я мог бы действительно ценить несколько советов, пожалуйста

РЕДАКТИРОВАТЬ: Python3 Сфинкс решил выше.

Теперь я импортирую константу DIR_PROCESSED из init.py

По некоторым причинам Сфинкс не любит это:

from medembed import DIR_PROCESSED
ImportError: No module named 'medembed

Сборка не удалась: https://readthedocs.org/projects/medembed/builds/7108602/

1 ответ

Решение

Было несколько вещей, которые не работали правильно со Сфинксом.

  • code.rst: вы должны указать имя пакета для каждого модуля, который вы хотите запустить autodoc на:

    .. automodule:: medembed.main
       :members:
    
    .. automodule:: medembed.dataset
       :members:
    
    .. automodule:: medembed.embedding
       :members:
    
    .. automodule:: medembed.transformer
       :members:
    
  • conf.py: путь, к которому вы хотите добавить SYSPATH это путь к родительскому каталогу пакета, а не сам пакет:

    sys.path.insert(0, os.path.abspath('../../'))
    
  • main.py, dataset.py, embedding.py, transformer.py: вы должны использовать относительный импорт вместо абсолютного, когда импортируете вещи из вашего пакета:

    -from transformer import Transformer
    +from .transformer import Transformer
    
    -from medembed import DIR_PROCESSED
    +from . import DIR_PROCESSED
    
    -from dataset import TxtDataset, XMLDataset
    -from embedding import Embedding
    +from .dataset import TxtDataset, XMLDataset
    +from .embedding import Embedding
    
  • main.py: не добавлять if __name__ == "__main__" директива: код будет выполняться при анализе Sphinx, а это не то, что вам нужно (см. этот пост). На самом деле, sphinx запрещает это и возвращает предупреждение, если вы попытаетесь:

    WARNING: autodoc: failed to import module 'medembed.main'; the module executes module level statement and it might call sys.exit().
    

    Вместо этого вы должны создать main.py в родительском каталоге, который не будет анализироваться sphinx:

    from medembed.main import main
    
    if __name__ == '__main__':
        main()
    

    Я использую абсолютный импорт здесь, как это main.py файла нет в medembed пакет.

Я создал запрос на извлечение репо со всеми этими изменениями: https://github.com/isaacsultan/MedEmbed/pull/4

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