package 在 python 中,是一种有效组织代码,module 可以是一个文件,可以通过 import 来导入一个 module 单个文件,而 package 则是作为一个目录来导入。随后我们还会看一看多层嵌套是如何导入的。
>>> import collections,socket >>> print(collections.__path__) ["/anaconda3/envs/py38/lib/python3.8/collections"] >>> print(socket.__path__) Traceback (most recent call last): File "", line 1, in AttributeError: module "socket" has no attribute "__path__"
我们看一看 python 提供标注库,例如 collections 和 socket,这里 collections 是一个 package 也就是意味着其是一个目录,在 python 文件,而 socket 则是一个 module,对于 socket 和我们之前介绍导入 module 一样。package 与 module 不同就是具有__path__
属性,我们可以通过__path__
来访问到存放 python 文件的路径。但是对于 module 并不存在这个属性。
在 python 中,有两种 package,分别是是 regular package 和 namespace package。
regular package:
我们首先来看一看 regular package,下面是一个 regular package 结构
main.py pkg1 ---__init__.py
在项目下,我们创建一个文件夹 kpg1 下面有一个文件__init__.py
,这样 package 就是 regular package,这样这个文件夹的名称就是一个 package 名称,我们导入 package 就可以直接导入这个 package 名称。在__init__.py
文件里添加如下语句.
print("importing pk1") def hi_say(): print("pkg1 say hi")
在 main.py 我们导入 package 也就是import pkg1
,python 通过 finder 来定位到 package 位置,pathFinder 通过在 sys.path 中的 path 搜索来定位到 package 的位置。大家还记得吗? sys.path 第一个 path 就是我们当前目录,这是为什么 python 可以定位到 pkg1 ,就是根据,当我们导入 package python 就会自动执行 package 下面的__init__.py
文件。当你 import package 时,module 的编译好 code 对象,我们可以通过pkg1.hi_say()
来。
print(pkg1.__path__)
通过 pkg1 的__path__
来方法 pkg1 的目录绝对路径。
print(pkg1.__file__)
而__file__
对应得到__init__.py
文件的绝对路径。
print(pkg1.__package__)
也可以通过 package 的__package__
的属性获取 package 的名称,同样可以通过__name__
来获取 module 的名称。
接下来我们进一步加大难度,就是 pkg1 文件夹下再新建一个 mod1.py 文件
main.py pkg1 ---__init__.py ---mod1.py
__init__.py
文件
print("importing pk1")
mod1.py 文件中,输出一条"import mod1"的信息,还定义了 say_hi 函数,接下来我们想要做的事导入这个 module 然后执行其中 say_hi 方法。
print("importing mod1") def say_hi(): print("pkg1 say hi")
import sys import pkg1 print("pkg1" in globals())#True print("pkg1" in sys.modules)#True
我们导入 pkg1 这样创建一个指向 module 对象的引用,然后添加全局变量中,同时作为 module 也会被添加到 sys.modules 缓存中。
然后当我们直接通过 pkg1.mod1 来访问 mod1 module 会抛出下面错误,告诉用户并不存在这个属性
AttributeError: module "pkg1" has no attribute "mod1"
也就是只是简单导入 package 并不会将其下的 module 一同导入,所以才会出现上面错误。如果想要导入 pkg1 下 mod1 我们需要使用import pkg1.mod1
这样正确方式来导入 mod1
import sys import pkg1.mod1
大家注意一下当我们导入 mod1 正确方式是用 import pkg1.mod1,从下面输出来看,python 先执行__init__.py
,也就是说 python 会先导入 package pkg1 然后再导入 module1 这样顺序。
importing pk1 importing mod1
如果下面方式可以访问到 module mod1 中的 say_hi() 方法。
pkg1.mod1.say_hi()
print("pkg1" in sys.modules)#True print("pkg1.mod1" in sys.modules)#True print("pkg1" in globals())#True print("pkg1.mod1" in globals())#False
通过上面输出我们发现 pkg1 和 pkg1.mod1 都存在于 sys.modules 缓存中,还有不难看出只有 pkg1 位于全局变量,我们只能通过 pkg1 的属性来方法 mod1。
简单总结一下,我们要方法一个 package 下的 module,首先会访问这个 package 会执行 package 下的__init__.py
然后再去执行 module 代码,在 sys.modules 保存 pkg1 和 pkg1.mod1 分别指向保存两个 module 对象的内存地址。
到此这篇关于 如何在python 中导入 package 的文章就介绍到这了,更多相关在 python 中导入 package 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
上一篇:go语言结构体指针操作示例详解
X 关闭
X 关闭
- 15G资费不大降!三大运营商谁提供的5G网速最快?中国信通院给出答案
- 2联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 3亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 4现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 5如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 6AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 7转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 8充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 9好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 10名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?