Skip to main content

32.10. 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)

将源文件编译为字节代码并写出字节代码高速缓存文件。源代码从名为 file 的文件加载。字节码写入 cfile,默认为 PEP 3147/PEP 488 路径,以 .pyc 结尾。例如,如果 file/foo/bar/baz.py cfile 将默认为Python 3.2的 /foo/bar/__pycache__/baz.cpython-32.pyc。如果指定了 dfile,它将用作错误消息中源文件的名称,而不是 file。如果 doraise 为真,则在编译 file 时遇到错误时引发 PyCompileError。如果 doraise 为false(默认值),则错误字符串写入 sys.stderr,但不会引发异常。此函数返回字节编译文件的路径,即使用任何 cfile 值。

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

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

在 3.2 版更改: cfile 的默认值更改为 PEP 3147 兼容。先前的默认值为 file + 'c' (如果启用优化,则为 'o')。还添加了 optimize 参数。

在 3.4 版更改: 更改代码以使用 importlib 进行字节代码高速缓存文件写入。这意味着文件创建/写入语义现在匹配什么 importlib,例如。权限,写和移动语义等。还添加了如果 cfile 是符号链接或非常规文件,则引发 FileExistsError 的警告。

py_compile.main(args=None)

编译几个源文件。在 args 中(或在命令行上,如果 argsNone)命名的文件被编译,并且所得到的字节代码以正常方式被高速缓存。此功能不会搜索目录结构以查找源文件;它只编译明确命名的文件。如果 '-' 是args中的唯一参数,则文件列表取自标准输入。

在 3.2 版更改: 添加了对 '-' 的支持。

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

参见

模块 compileall

用于编译目录树中所有Python源文件的实用程序。