py_compile编译Python源文件

源代码: Lib / py_compile.py


py_compile模块提供了一个生成字节码文件的函数源文件,以及模块源文件作为脚本被使用时使用的另一个函数.

虽然经常不需要,但在安装模块使用时,此功能非常有用,特别是如果某些用户可能没有权限在包含源代码的目录中编写字节代码缓存文件.

exception py_compile.PyCompileError
在尝试编译文件时发生错误时引发异常.
py_compile.compile (file, cfile=None, dfile=None, doraise=False, optimize=-1, invalidation_mode=PycInvalidationMode.TIMESTAMP
将源文件编译字节码并写出字节码缓存文件。源代码从名为file的文件加载。字节码写成cfile,默认为 PEP 3147 / PEP 488 路径,结尾.pyc。例如,如果file/foo/bar/baz.py cfile将默认为/foo/bar/__pycache__/baz.cpython-32.pyc用于Python 3.2。如果dfile指定了,它将被用作错误消息中的源文件的名称,而不是file。如果doraise为真,则在编译PyCompileError时遇到错误时会引发file。如果doraise为false(默认值),则会将错误字符串写入sys.stderr,但不会引发异常。这个函数返回字节编译文件的路径,//使用cfile

如果cfile成为(显式指定或计算)的路径是符号链接或非常规文件,FileExistsError将被引发。这是一个警告,如果允许将字节编译的文件写入这些路径,导入将把这些路径转换为常规文件。这是导入的副作用,使用文件重命名将最终的字节编译文件放置到位以防止并发文件写入问题.

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

invalidation_mode应该是PycInvalidationMode枚举的成员,并控制生成的字节码缓存如何在atruntime中失效。默认是PycInvalidationMode.CHECKED_HASH如果设置了SOURCE_DATE_EPOCH环境变量,则其他默认值PycInvalidationMode.TIMESTAMP.

在版本3.2中更改cfile的默认值更改PEP 3147 – 顺从。以前的默认是file+ "c""o"如果启用了优化)。还添加了optimize参数

更改版本3.4:更改了代码使用importlib用于字节码缓存文件写入。这意味着文件创建/写入语义现在匹配importlib所做的,例如,权限,写入和移动语义等。还添加了FileExistsError如果cfile是一个符号链接或非常规文件.

更改版本3.7:invalidation_mode参数是按PEP 552 。如果SOURCE_DATE_EPOCH环境变量设置,invalidation_mode将被强制PycInvalidationMode.CHECKED_HASH.

在版本3.7.2中更改: SOURCE_DATE_EPOCH环境变量没有longeroverrides invalidation_mode参数的值,并确定默认值代替。

class py_compile.PycInvalidationMode
解释器可用于确定字节码文件是否与源文件一致的可能方法的枚举。.pycfile表示其标题中所需的失效模式。请参阅缓存的字节码失效有关Python如何在运行时使.pyc文件无效的更多信息.

新版本3.7.

TIMESTAMP
.pycfile包含源文件的时间戳和大小,Python将与源文件atruntime的元数据进行比较以确定是否.pyc文件需要重新生成.
CHECKED_HASH
.pycfile包含源文件内容的哈希值,Python将在运行时与源进行比较以确定是否.pyc文件需要重新生成.
UNCHECKED_HASH
喜欢 CHECKED_HASH.pycfile包含源文件内容的哈希值。但是,Python会在运行时假设.pyc文件是迄今为止的,并且根本不对源文件验证.pyc .

.pycs通过Python之外的某些系统保持最新状态,如构建系统.

py_compile.mainargs=None
编译几个源文件。在args(或在命令行上,如果argsNone编译并生成的字节码以正常方式进行缓存。此函数不搜索directorystructure以查找源文件;它只编译明确命名的文件。如果"-"是args中唯一的参数,文件列表取自标准输入.

更改版本3.2:添加对"-".

的支持当此模块作为脚本运行时,main()用于编译命令行上命名的所有文件。如果其中一个文件无法编译,则退出状态为非零.

也可以看看

模块compileall
用于编译目录树中所有Python源文件的实用程序.