为什么我的python导入不起作用?

时间:2011-03-29 01:48:55

标签: python

这有效:

from story.apps.document import core
print core.submit()

这不起作用:

from story import apps
print apps.document.core.submit()

“story”是一个目录。在其中,有“apps”目录。在里面,有“文件”目录。 “core.py”是一个文件。

每个目录都有__init__.py

5 个答案:

答案 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),你会发现它只是一个空包。