32.10. py_compile — 编译 Python 源文件 — Python 文档
32.10. py_compile — 编译 Python 源文件
源代码: :source:`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 为 true,则在编译 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 中命名的文件(或在命令行上,如果 args 是
None
)被编译并以正常方式缓存生成的字节码。 此功能不搜索目录结构来定位源文件; 它只编译显式命名的文件。 如果'-'
是 args 中的唯一参数,则文件列表取自标准输入。3.2 版更改: 增加了对
'-'
的支持。
当此模块作为脚本运行时,main() 用于编译命令行上命名的所有文件。 如果无法编译文件之一,则退出状态为非零。