包中的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__.py
和submodule.py
,后者包含一个只打印“This is submodule”的函数。
现在,当你调用import subpackage
时,你调用并“拉”“subpackage”里面的所有东西,包括子模块,因此,subfunc()
函数。当你写subpackage.submodule.subfunc()
时,那里真的没有什么了不起的,你只需要调用mainfolder / container(subpackage。),然后是.py文件(子模块。),最后是函数本身(subfunc())。
以上是关于包中的Python导入功能的主要内容,如果未能解决你的问题,请参考以下文章
python已安装了一个包,但是导入包中的模块时报错没有这个包