我必须遗漏一些关于在Python中构建包的基本信息。当我按照https://docs.python.org/2/tutorial/modules.html#packages的准则创建一个包并导入它时,Python找不到任何模块。例如,假设我使用以下结构创建包holygrail:
我留下__init__.py为空,因为文档说我可以而且我只想尝试制作一个基本包。在knights.py我有:
def say():
print 'Ni!'
如果我尝试import holygrail
,Python不会给出任何错误,但holygrail.knights.say()
会导致Python告诉我"'模块'对象[holygrail]没有属性'骑士'。"但是,如果我通过from holygrail import knights
专门导入骑士,那么knights.say()
就可以了。此外,holygrail.knights.say()
也适用。
我尝试添加行
__all__ = ['knights']
<_> __ init__.py文件中的,但这并没有改变行为。
如何构建一个包,使import package
加载到所有模块中,允许package.module.function()
之类的语句?
答案 0 :(得分:2)
Python不会隐式导入整个包层次结构。您必须明确说明使用__init__.py
文件在包的哪个级别导入的内容。
当您在__all__ = ['knights']
中设置__init__.py
时,它仅适用于该模块的导入所有语句,例如:
>>> import holygrail
>>> holygrail.knights.say()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'knights'
>>> from holygrail import *
>>> knights.say()
Ni!
它还可以作为导入所有的过滤器,仅从模块导入指定的内容。
要在knights
上自动导入import holygrail
,您必须将import knights
或from . import knights
(intra-package or relative import)添加到__init__.py
。您必须明确地为每个模块执行相同的操作。
答案 1 :(得分:1)
将import knights
添加到__init__.py
。
您提供的链接确实声明“在最简单的情况下,__init__.py
可能只是一个空文件......”您的示例不是最简单的情况,就是全部。