Ошибка импорта 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