这有效:
from story.apps.document import core
print core.submit()
这不起作用:
from story import apps
print apps.document.core.submit()
“story”是一个目录。在其中,有“apps”目录。在里面,有“文件”目录。 “core.py”是一个文件。
每个目录都有__init__.py
。
答案 0 :(得分:7)
__init__.py
文件告诉python将目录解释为一个包,但它并不一定告诉python从目录中导入子包或其他文件(尽管如果你添加了相应的{{} 1}}陈述)。
对于大型包层次结构,通常最好要求显式导入子包。
答案 1 :(得分:6)
执行story.apps.document import core
时,您告诉Python解释器匹配描述模块story.apps.document
,导入它,然后将变量core
从其命名空间加载到当前之一。
因为core
是一个文件模块,所以它在该文件中定义的名称空间变量中有submit
。
执行from story import apps
时,您告诉Python解释器匹配描述模块story
,导入它,然后将变量apps
从其命名空间加载到当前之一。
因为apps
是一个目录模块,它在其__init__.py
和该目录中的其他模块中定义的命名空间变量中具有。因此apps
知道document
,但它对document
的子模块core
一无所知。
FYI:这有时让人困惑的原因是因为这样的事情...
工作得很好:
# File1
import story.apps.document
story.apps.document.core()
不起作用:
# File2
import story
story.apps.document.core() # <-- Looks like the same function call, but is an Error
对于file1
,导入有效,因为import
操作会尝试智能地查找文件系统上的内容。函数调用有效,因为导入了模块document
,它只是名为story.apps.document
。
对于file2
,函数调用不起作用,因为对点运算符没有任何智能,它只是尝试访问Python对象上的属性 - 它对文件系统或模块一无所知。 / p>
答案 2 :(得分:1)
当您从故事导入应用程序执行操作时,您不会在应用程序中包含所有子包,为此,您可以执行类似的操作,
来自story.apps.document import *
答案 3 :(得分:1)
仅当story/__init__.py
导入apps
时才有效。
答案 4 :(得分:0)
在第二个示例中,您只导入包。 Python不会自动导入子包或模块。您必须明确地执行此操作,如第一个示例中所示。做一个dir(apps)
,你会发现它只是一个空包。