字节编译Python库

Python是一种基于解释器的语言。但是,当运行脚本(.py扩展名)时,它会在内部将源代码编译为字节码,此后字节码版本会自动删除。首次导入模块(除预编译的内置模块之外)时,也会自动构建其编译版本,但以.pyc扩展名保存在__pycache__文件夹中。随后再次调用以导入同一模块将不会重新编译该模块,而是使用已构建的模块。

但是,扩展名为.py的Python脚本文件可以不运行而直接编译。为此“ py_compile”模块包含“ compile()”函数。生成的.pyc文件的名称后附加Python版本号。在Python 3.7的情况下,名称后缀为“ cpython-37”。

您通常不需要此模块。但是,在安装模块以供共享使用时特别有用,尤其是在某些用户无权在包含源代码的目录中写入字节码缓存文件的情况下。

该模块具有命令行界面。可以使用–m开关将其导入,如下所示

E:\python37>python -m py_compile hello.py

这将在__pycache__子文件夹中创建并存储“ hello.cpython-37.pyc”文件。

字节编译也可以使用compile()py_compile模块中的函数以编程方式完成。

import py_compile
py_compile.compile("hello.py")

扩展名为.pyc的字节码文件可以与扩展名为.py的普通脚本一样,从命令行直接执行。

E:\python37>python __pycache__/hello.cpython-37.pyc

但是,它可以由与编译字节码文件相同版本的解释器执行。如果我们尝试使用任何其他版本的Python运行它,则会显示以下错误。

C:\python36>python e:hello.cpython-37.pyc
RuntimeError: Bad magic number in .pyc file

py_compile模块具有另一个main()编译几个源文件的功能。将编译名为参数的文件,并以正常方式缓存生成的字节码。该功能不会搜索目录结构来查找源文件;它仅编译显式命名的文件。

该模块还定义了PyCompileError异常,该异常在尝试编译文件时发生错误时引发。(只有在功能上将doraise选项设置为True时,才会引发此问题compile()

compile()函数的optimize选项控制优化级别,并传递给内置compile()函数。默认值-1选择当前解释器的优化级别。