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

2024-06-06 15:26:50 发布

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

这是有效的:

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

这不起作用:

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

“故事”是一个目录。里面有“apps”目录。里面有“文档”目录“core.py”是一个文件。

每个目录中都有一个__init__.py


Tags: apps文件from文档pycoreimport目录
3条回答

当你从story import应用程序中执行时,你不会将所有子包都包含在应用程序中,为此,你会执行如下操作:

从story.apps.document import*

当您执行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


仅供参考:这有时让人困惑的原因是这样的事情。。。

工作正常:

# 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,函数调用不起作用,因为dot运算符没有任何智能,它只是试图访问Python对象上的属性——它对文件系统或模块一无所知。

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

对于大型包层次结构,通常最好要求显式导入子包。

相关问题 更多 >