2011-03-29 24 views
4

这工作:我的python导入怎么不起作用?

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

这不起作用:

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

“故事” 是一个目录。里面有“应用程序”目录。里面有“文件”目录。 “core.py”是一个文件。

在每个目录中都有__init__.py

回答

0

在第二个例子中,您只导入了包。 Python不会自动导入子包或模块。你必须明确地做到这一点,就像第一个例子。做一个dir(apps),你会发现它只是一个空包。

1

当你从故事导入应用程序做什么,你不包括里面的应用程序的所有子包,对于这一点,你这样做,

从story.apps.document进口*

7

__init__.py文件告诉python将目录解释为一个包,但它不一定告诉python从目录中导入子包或其他文件(尽管它可能会添加适当的import语句)。

对于大包裹层次结构,通常最好要求明确导入子包裹。

1

这只适用于如果story/__init__.py进口apps

5

当你做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对象上的属性 - 它不知道关于文件系统或模块的任何信息。

+1

什么可以更加迷惑人的是,如果'file1'先进口,然后'file2'就可以了(因为'file1'已经做了必要的繁重让一切正确导入) – ncoghlan 2011-03-29 03:40:53