Python在我的包中找不到模块

2024-06-16 10:21:43 发布

您现在位置:Python中文网/ 问答频道 /正文

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

  • 空心轨/
    • __初始值
    • 在骑士.py在

我把u init_uu.py留为空,因为文档上说我可以,而我只是试图创建一个基本的包来启动。在骑士.py我有:

def say():
     print 'Ni!'

如果我尝试import holygrail,Python不会给出任何错误,但是holygrail.knights.say()会导致Python告诉我“'module”对象[holygrail]没有属性“knights”。但是,如果我通过from holygrail import knights导入骑士,那么knights.say()就可以了。另外,holygrail.knights.say()也可以。在

我试着加上一行

^{pr2}$

但这并没有改变行为。在

如何构造一个包,使import package加载到所有模块中,并允许package.module.function()之类的语句?在


Tags: 模块pyhttpsorgimportdocspackagetutorial
2条回答

import knights添加到__init__.py中。在

您提供的链接声明“在最简单的情况下,__init__.py可能只是一个空文件…”您的示例不是最简单的情况,仅此而已。在

Python不会隐式导入整个包层次结构。必须明确使用__init__.py文件在包的哪个级别导入什么。在

当您在__init__.py中设置__all__ = ['knights']时,它只适用于该模块的import all语句,例如:

>>> 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 all上的过滤器,只从模块中导入指定的内容。在

要使knights自动导入到import holygrail上,必须将import knights或{}(intra-package or relative import)放入__init__.py。您必须对每个模块显式地执行相同的操作。在

相关问题 更多 >