# 32.11. `compileall` - 字节编译Python库

源代码： Lib / compileall.py

此模块提供一些实用程序功能以支持安装Python库。这些函数在目录树中编译Python源文件。此模块可用于在库安装时创建缓存的字节代码文件，这使得即使对没有库目录的写权限的用户也可以使用它。

## 32.11.1. 命令行使用

这个模块可以作为一个脚本（使用python -m compileall）来编译Python源代码。

`directory``...`
`file``...`

  位置参数是要编译的文件或包含源文件的目录，以递归方式遍历。如果没有给出参数，表现为命令行为`-l ＆lt； directories 来自 sys.path>` 。

`-l```

  不要递归到子目录中，只编译直接包含在named或implied目录中的源代码文件。

`-f```

  强制重建，即使时间戳是最新的。

`-q```

  不要打印编译的文件列表。如果传递一次，仍会打印错误消息。如果传递两次（`-qq`），则所有输出都被抑制。

`-d` `destdir`

  目录位于正在编译的每个文件的路径之前。这将出现在编译时间追踪中，并且还被编译到字节代码文件中，在字节代码文件被执行时源文件不存在的情况下，它将被用在追踪和其他消息中。

`-x` `regex`

  regex用于搜索考虑进行编译的每个文件的完整路径，如果正则表达式产生匹配，则跳过该文件。

`-i` `list`

  读取文件`list`，并将其中包含的每行添加到要编译的文件和目录列表中。如果`list`为`-`，请读取`stdin`的行。

`-b```

  将字节代码文件写入其旧位置和名称，这可能会覆盖由另一版本的Python创建的字节代码文件。默认是将文件写入其 PEP 3147位置和名称，这允许来自多个版本的Python的字节代码文件共存。

`-r```

  控制子目录的最大递归级别。如果给出，则不会考虑`-l` python -m compileall＆lt； directory＆gt； -r 0等效于python -m compileall＆lt； directory＆gt； -l。

`-j` `N`

  使用N工具来编译给定目录中的文件。如果使用`0`，那么将使用`os.cpu_count()`的结果。

在版本3.2中更改：添加了`-i`，`-b`和`-h`选项。

在3.5版中已更改：添加了`-j`，`-r`和`-qq`选项。`-q`选项已更改为多级值。`-b`将始终产生以`.pyc`结尾的字节代码文件，而不是`.pyo`。

没有命令行选项来控制`compile()`函数使用的优化级别，因为Python解释器本身已经提供了选项：python -O -m compileall t3 >。

## 32.11.2. 公开函数

`compileall.``compile_dir`(dir, maxlevels=10, ddir=None, force=False, rx=None, quiet=0, legacy=False, optimize=-1, workers=1)

  递归地下降由dir命名的目录树，编译所有`.py`文件。

  maxlevels参数用于限制递归深度；它默认为`10`。

  如果给出ddir，它将被编译到编译时间跟踪中使用的每个文件的路径前面，并且还被编译到字节代码文件中，它将用于回溯，在源文件在执行字节代码文件时不存在的情况下的其他消息。

  如果force为true，即使时间戳是最新的，模块也会重新编译。

  如果给定rx，将在被考虑用于编译的每个文件的完整路径上调用其搜索方法，如果返回true值，则跳过该文件。

  如果quiet为`False`或`0`（默认值），文件名和其他信息将打印到标准输出。设置为`1`，只打印错误。设置为`2`，所有输出都被抑制。

  如果legacy为真，则字节代码文件将写入其旧位置和名称，这可能会覆盖由另一版本的Python创建的字节代码文件。默认是将文件写入其 PEP 3147位置和名称，这允许来自多个版本的Python的字节代码文件共存。

  optimize指定编译器的优化级别。它被传递给内建`compile()`函数。

  参数workers指定使用多少工作程序并行编译文件。默认是不使用多个工人。如果平台不能使用多个工作程序，并且给出工作参数，则顺序编译将用作备用。如果workers低于`0`，则会引发`ValueError`。

  在版本3.2中已更改：添加了旧版和优化参数。

  在版本3.5中已更改： t>>添加了工人参数。

  在3.5版本中已更改： quiet参数已更改为多级值。

  在版本3.5中已更改： 旧版参数只写出`.pyc`文件，而不是`.pyo` optimize的值为。

`compileall.``compile_file`(fullname, ddir=None, force=False, rx=None, quiet=0, legacy=False, optimize=-1)

  使用路径fullname编译文件。

  如果给出了ddir，则它被添加到正在编译以用于编译时间回溯的文件的路径，并且还被编译到字节代码文件中，在那里它将用于回溯在源文件在执行字节代码文件时不存在的情况下的其他消息。

  如果给出rx，则其搜索方法将完整路径名传递给正在编译的文件，如果返回真值，则不会编译该文件，并且`True`回。

  如果quiet为`False`或`0`（默认值），文件名和其他信息将打印到标准输出。设置为`1`，只打印错误。设置为`2`，所有输出都被抑制。

  如果legacy为真，则字节代码文件将写入其旧位置和名称，这可能会覆盖由另一版本的Python创建的字节代码文件。默认是将文件写入其 PEP 3147位置和名称，这允许来自多个版本的Python的字节代码文件共存。

  optimize指定编译器的优化级别。它被传递给内建`compile()`函数。

  版本3.2中的新功能。

  在3.5版本中已更改： quiet参数已更改为多级值。

  在版本3.5中已更改： 旧版参数只写出`.pyc`文件，而不是`.pyo` optimize的值为。

`compileall.``compile_path`(skip_curdir=True, maxlevels=0, force=False, quiet=0, legacy=False, optimize=-1)

  字节编译沿`sys.path`找到的所有`.py`文件。如果skip_curdir为true（默认值），则当前目录不包含在搜索中。所有其他参数都传递给`compile_dir()`函数。注意，与其他编译函数不同，`maxlevels`默认为`0`。

  在版本3.2中已更改：添加了旧版和优化参数。

  在3.5版本中已更改： quiet参数已更改为多级值。

  在版本3.5中已更改： 旧版参数只写出`.pyc`文件，而不是`.pyo` optimize的值为。

要强制重新编译`Lib/`子目录及其所有子目录中的所有`.py`文件：

    import compileall

    compileall.compile_dir('Lib/', force=True)

    # Perform same compilation, excluding files in .svn directories.
    import re
    compileall.compile_dir('Lib/', rx=re.compile(r'[/\\][.]svn'), force=True)

也可以看看

模块`py_compile`
  字节编译单个源文件。