来自 __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.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分析时执行,这不是你想要的(见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
我在使用 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.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分析时执行,这不是你想要的(见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