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的包
  • 一个编译过的扩展模块,以CC++或其它语言编写,当被引用的时候会动态的链接到
  • 一个以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系统提供了更加常用的加速方法。

原创粉丝点击