包中的Python导入功能

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了包中的Python导入功能相关的知识,希望对你有一定的参考价值。

(Python 3.6)

我有这个文件夹结构:

package/
       start.py
       subpackage/
                 __init__.py
                 submodule.py

submodule.朋友:

def subfunc():
    print("This is submodule")

__ init __.py:

from subpackage.submodule import subfunc

start.朋友:

import subpackage 

subpackage.subfunc()

subpackage.submodule.subfunc()

我明白了如何以及为什么

subpackage.subfunc()

作品。

但我不明白为什么:

subpackage.submodule.subfunc()

如果我还没有做的话也有效:

from subpackage import submodule

也不:

import subpackage.submodule

既不是在__ init __.py中也不是在start.py中

非常感谢,如果有人可以清除我的怀疑。

答案

当发布from subpackage.submodule import subfunc时,python会为你做two things:一,搜索并评估名为subpackage.submodule的模块,将其放入sys.modules缓存中;二,填充subpackage.submodule.subfunc对象并将名称“subfunc”绑定到当前模块的命名空间:

import语句结合了两个操作;它搜索命名模块,然后将搜索结果绑定到本地范围中的名称。

导入subpackage.submodule时,submodule的父级也导入了:

虽然可能会出现某些副作用,例如导入父包,以及更新各种缓存(包括sys.modules)......

在导入subpackage.submodule的最后阶段,python会在其父as an attribute上设置模块subpackage,这个行为是documented

当使用任何机制(例如importlib API,import或import-from语句或内置__import __())加载子模块时,绑定将放在父模块的命名空间中,并放到子模块对象中。


另一答案

如果我说得对,你有一个名为“package”的文件夹,里面有两件事:一个.py文件和另一个名为“subpackage”的文件夹。

在“subpackage”里面你有__init__.pysubmodule.py,后者包含一个只打印“This is submodule”的函数。

现在,当你调用import subpackage时,你调用并“拉”“subpackage”里面的所有东西,包括子模块,因此,subfunc()函数。当你写subpackage.submodule.subfunc()时,那里真的没有什么了不起的,你只需要调用mainfolder / container(subpackage。),然后是.py文件(子模块。),最后是函数本身(subfunc())。

以上是关于包中的Python导入功能的主要内容,如果未能解决你的问题,请参考以下文章

python已安装了一个包,但是导入包中的模块时报错没有这个包

在不修改 sys.path 或 3rd 方包的情况下导入 Python 包中的供应商依赖项

将Rcpp头文件导入NAMESPACE中的R包中

如何导入python中的模块

如何导入安装在站点包中的模块

有条件地导入 python 类的片段