来自__init__.py的ReadTheDocs导入错误

时间:2018-04-27 14:14:26

标签: python python-sphinx read-the-docs autodoc

我在使用readthedocs 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 Sphinx解决了上述问题。

现在,我从 init.py

导入常量DIR_PROCESSED

出于某种原因,Sphinx不喜欢这样:

from medembed import DIR_PROCESSED
ImportError: No module named 'medembed

构建失败: https://readthedocs.org/projects/medembed/builds/7108602/

1 个答案:

答案 0 :(得分:2)

有很多事情与Sphinx无法正常工作。

  • 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.pydataset.pyembedding.pytransformer.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分析时执行,而这不是您想要的(请参阅this post)。事实上,如果你尝试的话,sphinx会禁止这个并发出警告:

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

    你应该做的是在父目录中创建一个不会被sphinx分析的main.py

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

    我在这里使用绝对导入,因为此main.py文件不在medembed包中。

我在您的repo上创建了一个包含所有这些更改的拉取请求: https://github.com/isaacsultan/MedEmbed/pull/4