Sphinx和Python3中的相关导入*

2024-04-20 01:47:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含python包的目录,如下所示:

--docs/index.rst
--docs/...
--app/__init__.py
--app/foo.py

我使用sphinx和autodocs来记录应用程序(在python3.3中)。在

现在,在conf.py(在docs/)中,我有

^{pr2}$

cd进入docs/,运行

make html

这给了我

系统错误:父模块“”未加载,无法执行相对导入

所有具有

from .foo import Bar

我有一个干净的斯芬克斯虚拟安装使用

pip install Sphinx

在我为Python3.3创建了(干净的)环境之后。在

我错过了什么?在

发生这种情况时,我正在将项目从Python2.*移到Python3.*。所有的项目都在工作,但是这个。。。在


Tags: 项目py目录app应用程序docsindexfoo
1条回答
网友
1楼 · 发布于 2024-04-20 01:47:33

您的app目录是一个包。包是一个目录,其中包含__init.py__和其他文件。在

如果您在sys.path上放置了一个包目录,那么所有的事情都会出错。在

举个例子:

root/
    app/
        app/__init__.py
        app/spam.py
        app/eggs.py

如果您的sys.path上有root(因为它是您当前的工作目录,或者因为您显式地做了它,或者因为您已经正确地将东西安装到您的site-packages),那么app是一个包,app.spam是一个模块,app.eggs内,.spam是该模块。所以,一切正常。在

如果您的sys.path上有{},那么{}不是一个包,spam是一个模块,eggs中,.spam不是任何东西。所以,你不能使用相对进口。在

如果您的sys.path上都有两个,那么app是一个包,spam和{}都是不同的模块(具有相同的内容,执行两次),并且在app.eggs中,.spam是一个模块,但是在eggs.spam不是任何东西。这会给你带来无尽的麻烦。在


所以,最有可能的是,你想要的解决办法是:

^{pr2}$

如果在..中有其他包,或者是充满了不是包的Python代码的目录(例如,tests目录中有tests/test_spam.py),那么您需要重新构造目录,将app放入一个没有其他Python代码的目录中,如下所示:

root/
    src/
        app/
    tests/
    doc/

或者,如果您不希望app成为一个包,而是希望成为一个系统路径根目录,然后终止__init__.py,并将app直接留在sys.path中。但是在这种情况下,您不能使用包内相对导入;app中的所有模块都是顶级模块,必须这样导入。在


本教程的Packages部分(以及上面章节的其余部分)解释了其中的一些内容,但是可能有更好的介绍性文档。在

对于完整的细节,在3.3+中,The import system拥有一切,组织得很好;对于旧版本,参考文档是混乱的、不完整的、分散的;您必须从The ^{} statement开始,然后阅读The Knights Who Say Neeeow ... Wum ... Ping!(基本上是一个PEP,但1.5还没有PEP),甚至可能是{}文档,如果您能找到的话,再加上各种政治公众人物和小变化日志条目,解释了事情是如何在1.5到2.7或3.2之间发生变化的。在

相关问题 更多 >