我有一个包含python包的目录,如下所示:
--docs/index.rst
--docs/...
--app/__init__.py
--app/foo.py
我使用sphinx和autodocs来记录应用程序(在python3.3中)。在
现在,在conf.py
(在docs/
)中,我有
我cd
进入docs/
,运行
make html
这给了我
系统错误:父模块“”未加载,无法执行相对导入
所有具有
from .foo import Bar
我有一个干净的斯芬克斯虚拟安装使用
pip install Sphinx
在我为Python3.3创建了(干净的)环境之后。在
我错过了什么?在
发生这种情况时,我正在将项目从Python2.*移到Python3.*。所有的项目都在工作,但是这个。。。在
您的
app
目录是一个包。包是一个目录,其中包含__init.py__
和其他文件。在如果您在
sys.path
上放置了一个包目录,那么所有的事情都会出错。在举个例子:
如果您的
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代码的目录中,如下所示:或者,如果您不希望
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之间发生变化的。在
相关问题 更多 >
编程相关推荐