Python找不到我包中的模块
我好像在用Python创建包的时候,漏掉了一些基本的东西。当我按照这个链接的指导来创建一个包并导入它时,Python找不到任何模块。比如,我创建了一个叫做holygrail的包,结构如下:
- holygrail/
- __init__.py
- knights.py
我把__init__.py留空,因为文档上说可以这样做,我只是想先做一个基本的包。在knights.py里,我写了:
def say():
print 'Ni!'
当我尝试用import holygrail
导入时,Python没有报错,但当我调用holygrail.knights.say()
时,Python告诉我“'module'对象[holygrail]没有属性'knights'。”不过,如果我直接用from holygrail import knights
导入knights,那么knights.say()
就可以正常工作了。而且,这样一来,holygrail.knights.say()
也能正常使用。
我试着在__init__.py文件里添加了这一行:
__all__ = ['knights']
但这并没有改变结果。
我该如何构建一个包,让import package
时能加载所有模块,这样就可以使用像package.module.function()
这样的语句呢?
2 个回答
在__init__.py
文件中添加import knights
。
你提供的链接确实提到过“在最简单的情况下,__init__.py
文件可以是一个空文件……”你的例子并不是最简单的情况,仅此而已。
在Python中,它不会自动导入整个包的层级结构。你需要在每个包的__init__.py
文件中明确指定要导入什么内容。
当你在__init__.py
中设置__all__ = ['knights']
时,这个设置只对该模块的导入所有语句有效,比如:
>>> 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!
这个设置也可以作为一个过滤器,只导入模块中指定的内容。
如果你想在使用import holygrail
时自动导入knights
,你需要在__init__.py
中添加import knights
或者from . import knights
(这叫做包内导入或相对导入)。你需要对每个模块都这样做。