Learning Python Part III 之 Import 中的模块文件选择
来源:互联网 发布:wocom 手绘板 mac 编辑:程序博客网 时间:2024/06/06 14:22
时刻记着Import语句中的文件名后缀是省略的。Python会选择在搜索路径中找到的第一个符合文件名的文件。事实上,import正是外部扩展组件的意义所在——源码、各种各样的字节代码、编译过的扩展等等,Python会自动选择任何类型的符合模块名字的文件。
模块源
例如,一个import语句import b
会如何加载和处理:
- 一个名叫
b.py
的源代码文件 - 一个名叫
b.pyc
的字节代码文件 - 一个名叫
b.pyo
的最优化的字节代码文件 - 一个直接名叫
b
的包 - 一个编译过的扩展模块,以
C
、C++
或其它语言编写,当被引用的时候会动态的链接到 - 一个以
C
编写的内置模块文件,并且静态的接入Python - 一个
ZIP
文件组件,当被引用的时候会自动解压缩 - An in-memory image, for frozen executables
- Jython中的
Java
类 - IronPython中的
.NET
组件
C扩展、Jython和包导入都是单个文件之外的导入扩展。对于导入者来说,无论是引用或者匹配一个模块的属性,加载文件类型的不同是完全不相关的。一些标准库事实上是以C语言写的而不是Python。因为这些模块看起来和Python代码的模块文件并没有什么区别,使用者并不需要关心这些。
选择的优先顺序
如果说你同时有b.py和b.so在不同的文件夹中,Python往往会加载第一个在模块搜索路径中发现的文件,也就是sys.path中从左到右第一个发现的目录。但是如果在相同目录中发现b.py和b.so时会发生什么?这种情况下,Python会服从一个标准的选择顺序,尽管这种顺序并不能保证在不同的时候会有同样的效果。总的来说,你并不能指望在一个给定的文件夹里Python会选择哪个——使你的模块名更直接一点或者配置你的模块搜索路径去确保你的模块选择优先级更加精准。
引用钩子函数(import hooks)和zip文件
通常情况下,import的工作原理和之前描述的一样——找到并在你的机器上加载。然而,也可以重新定义Python中的import的操作,通过一个称作引用钩子函数(import hooks)的东西。这些钩子函数可以用来时import很多有用的事情,例如从压缩包中加载文件、执行解密操作等等。
事实上,Python本身会通过这些钩子函数直接从ZIP压缩包中导入文件:在import时,当一个.zip文件在模块搜索路径中被选中后会自动解压。例如,之前sys,path显示的其中一个标准库目录就是一个.zip文件,如果想仔细研究,可以查询Python 的标准库手册中关于内置函数import的描述——import实际运行的可定制工具。
最优化字节代码文件
Python也支持.pyo
的字节代码文件最优化,通过 -0
的命令行参数创建并运行和一些注册工具自动生成。因为这些会运行起来更快比起.pyc
文件(典型的是5%),然而,这种方法并不常用。PYPY系统提供了更加常用的加速方法。
- Learning Python Part III 之 Import 中的模块文件选择
- Learning Python Part III 之 模块
- Learning Python Part III 之 Import 是如何工作的
- Learning Python Part III 之 模块的搜索路径
- Learning Python Part III 之 模块的使用
- Learning Python Part III 之 模块的重载
- Learning Python Part III 之 字节代码文件:__pycache__
- Learning Python Part I 之 文件
- python之import模块详解
- python之import模块详解
- Learning Python Part I 之动态类型
- Learning Python Part I 之 字符串
- Learning Python Part I 之 列表
- Learning Python Part I 之 字典
- Learning Python Part I 之 元组
- Learning Python Part II 之 Print
- Learning Python Part II 之 nonlocal语句
- Python之import方法引入模块详解
- 数据库dao包
- angularjs购物车结算页面
- js中的几种克隆方法
- leetcode 187. Repeated DNA Sequences
- 友链
- Learning Python Part III 之 Import 中的模块文件选择
- Python_必应每日壁纸更换
- Unity实现第三人称角色控制
- 【贪心】51Nod 1476 括号序列的最小代价
- YTU OJ 2507: 李白打酒(蓝桥杯题目)
- java-Set&List
- Mybatis采用redis实现二级缓存
- Angular中$scope类的简介及作用——(学习笔记①)
- Vue中如何定义全局函数