Python在我的包中找不到模块

时间:2014-07-16 19:15:39

标签: python import package

我必须遗漏一些关于在Python中构建包的基本信息。当我按照https://docs.python.org/2/tutorial/modules.html#packages的准则创建一个包并导入它时,Python找不到任何模块。例如,假设我使用以下结构创建包holygrail:

  • holygrail /
    • __初始化__。PY
    • knights.py

我留下__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()之类的语句?

2 个答案:

答案 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 knightsfrom . import knightsintra-package or relative import)添加到__init__.py。您必须明确地为每个模块执行相同的操作。

答案 1 :(得分:1)

import knights添加到__init__.py

您提供的链接确实声明“在最简单的情况下,__init__.py可能只是一个空文件......”您的示例不是最简单的情况,就是全部。