python模块导入过程

来源:互联网 发布:钢铁雄心4汉化版mac 编辑:程序博客网 时间:2024/05/22 14:14
在python中,当我们需要在一个模块中引用另一个模块中的内容时,我们需要通过将需要引用的模块import当前模块中来。对于不熟悉python的人来说,他们可能会认为python中的import与C语言中的#include,或者是Java中的import是一样的。但其实它们之间是有区别的,在python中,import一个模块不仅仅是将另外一个文件中的文本插入到当前文件中。实际上,import是在运行时发生的(python只有运行时,没有编译时),它包含以下3个步骤:
  • 找到需要import的那个文件
  • 如果有必要,则将这个文件编译成字节码文件
  • 运行这个文件,已构建文件中定义的对象(包括函数,在Python中函数也是对象)
以上3个步骤全都是在运行时进行的,并且只有第一次import时,才会执行。下面分别来看这3个步骤的具体行为。
1、找文件
首先Python必须先找到需要import的文件,为了找到python会按照顺序依次在以下目录中取搜寻文件:
  • home目录;
  • PYTHONPATH目录;
  • 标准库目录;
  • 任何”.pth“后缀名的文件中所定义的目录;
  • 第三方的的site-packages的home目录。
以上所有的路径连在一起,存储于sys.path变量中,这个是一个list对象,可以手动修改。
1.1 home目录
python首先会搜索home目录,而home目录根据运行方式而不同;如果直接运行程序,那home目录就是程序文件所在的目录;如果在交互环境下执行,则home目录就是当前目录。由于home目录是第一个搜索的目录,所以得防止模块覆盖。所谓模块覆盖,即home目录下存在了其他我们真正需要的模块相同的文件名的文件,那么import将无法找到真正需要的那个模块,而是在搜索home目录之后,搜索便结束了。
1.2 PYTHONPATH目录
PYTHONPATH是可配置的,它是一个环境变量。在搜索完home目录之后,如果没有找到,则python下一步就会在PYTHONPATH环境变量中配置的目录中寻找。这里是配置用户自己自定义的一些路径。
1.3 标准库目录
标准库目录即python安装目录下的Lib文件夹,这无需我们手动配置。
1.4 .pth文件中的目录
与PYTHONPATH类似,这也是一个可以由用户手动配置搜索路径的地方。我们可以在任何python能够找到的路径的地方,创建一个后缀为”.pth“的文件,将我们希望python搜索的路径一行一个的写入这个文件。python会搜集所有发现的”.pth“文件中的所有路径,并去除重复和不存在的路径,然后在这些路径中寻找。”.pth“文件通常方法安装目录下,以供python读取。
1.5 第三方扩展包安装目录
在Python的安装目录下,我们可以看到site-packages这个子目录。这个目录里存放的是第三方库的目录,Python最后会自动在这个目录中查找。
最后,如果我们想知道Python所搜寻的路径,只需要查看sys.path这个list对象即可。这里面存储了python的搜索路径列表,在程序启动时,python会根据我们的配置,自动设置这个list对象。

2、编译成字节码
在找到文件之后,如果有必要则将文件编译成字节码。那什么情况下需要编译,而什么情况又不需要编译呢?
2.1 需要编译的情况
  • 字节码文件不存在
  • 字节码文件比源代码更旧,即源代码文件在上次生成字节码文件之后被改变了
  • 字节码文件是由其他版本的python生成的
2.2 不需要编译的情况
当python找到了对应的字节码文件(后缀为".pyc")不必源代码文件旧,并且它是由相同版本的python编译生成的,则无需编译。另外,也存在一种情况,即没有源代码文件,只有字节码文件,此时python无法对文件进行编译,python会直接使用这个字节码文件。
2.3 字节码文件存储路径
在python 3.1及之前的版本,字节码文件的后缀为“.pyc”,并存储于源代码文件相同的目录中。字节码文件内部会记录创建该文件的python的版本信息,所以python知道什么时候应该去重新编译。而在python 3.2之后,字节码文件同样以“.pyc”为后缀,但存储的路径不在源代码同一个目录。而是在源代码的同一层目录上,创建一个“__pycache__"子目录,字节码文件即存储于这个子目录中。并且在文件名中会记录python编译器的信息,如我的电脑上的文件字节码文件名称组成如下:”文件名.cpython-34.pyc“,意思是这个字节码文件是由python 3.4版本创建的,而python的是C实现,而非Java或其他语言。

3、运行文件
在第一次import文件到内存时,python会执行这个文件。如果这个文件中除了函数定义、类定义之外有其他的真正可运行的代码,那么python会直接运行它。比如在文件中有print用于直接打印信息,那么我们可以看到print的信息。

0 0
原创粉丝点击