# 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)

  将源文件编译为字节代码并写出字节代码高速缓存文件。源代码从名为文件的文件加载。The byte-code is written to cfile, which defaults to the PEP 3147/PEP 488 path, ending in `.pyc`. 例如，如果文件是`/foo/bar/baz.py` cfile，则默认为`/foo/bar/__pycache__/baz.cpython-32.pyc`。如果指定dfile，则它将用作错误消息中源文件的名称，而不是文件。如果doraise为真，则在编译文件时遇到错误时会引发`PyCompileError`。如果doraise为false（默认值），则将错误字符串写入`sys.stderr`，但不会引发异常。此函数返回字节编译文件的路径，即不管使用什么cfile值。

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

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

  在版本3.2中已更改：将cfile的默认值更改为 PEP 3147。之前的默认值为文件 + `'c'`（如果启用优化，则为`'o'`）。还添加了optimize参数。

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

`py_compile.``main`(args=None)

  编译几个源文件。在args中命名的文件（或在命令行上，如果args是`None`）被编译，并且生成的字节代码缓存在正常方式。此函数不搜索目录结构以查找源文件；它只编译明确命名的文件。如果`'-'`是args中的唯一参数，则文件列表取自标准输入。

  在版本3.2中更改：添加对`'-'`的支持。

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

也可以看看

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