Python找不到我包中的模块

4 投票
2 回答
1515 浏览
提问于 2025-04-18 13:35

我好像在用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 个回答

1

__init__.py文件中添加import knights

你提供的链接确实提到过“在最简单的情况下,__init__.py文件可以是一个空文件……”你的例子并不是最简单的情况,仅此而已。

3

在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(这叫做包内导入或相对导入)。你需要对每个模块都这样做。

撰写回答