来自 __init__.py 的 ReadTheDocs 导入错误

ReadTheDocs Import Error from __init__.py

我在使用 readthedocs autodocs 时遇到问题 - 构建完成但我的文档对于每个 class.

都是空的

查看构建信息,似乎出现了导致一些警告的语法错误:

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/

Sphinx 有很多地方不能正常工作。

  • code.rst: 你应该为你想要的每个模块指明包名 运行 autodoc on:

    .. 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 禁止这样做,如果你尝试 returns 会发出警告:

    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 包中。

我在你的仓库上创建了一个拉取请求,其中包含所有这些更改: https://github.com/isaacsultan/MedEmbed/pull/4