Skip to main content

32.11. compileall —字节编译Python库

源代码: Lib/compileall.py


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

32.11.1. 命令行使用

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

directory ...
file ...

位置参数是要编译的文件或包含源文件的目录,以递归方式遍历。如果没有给出参数,就像命令行是 -l <directories from 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 <directory> -r 0 相当于 python -m compileall <directory> -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

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 文件。如果所有文件都已成功编译,则返回true值,否则返回false值。

maxlevels 参数用于限制递归的深度;它默认为 10

如果给出了 ddir,它被添加到被编译以用于编译时间回溯的每个文件的路径之前,并且还被编译到字节代码文件中,其中它将被用于回溯和其他消息中,其中源文件在执行字节代码文件时不存在。

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

如果给出 rx,它的搜索方法在被考虑用于编译的每个文件的完整路径上被调用,并且如果它返回一个真值,则跳过该文件。

如果 quietFalse0 (默认值),则文件名和其他信息将打印到标准输出。设置为 1,只打印错误。设置为 2 时,所有输出被抑制。

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

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

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

在 3.2 版更改: 添加了 legacyoptimize 参数。

在 3.5 版更改: 添加了 workers 参数。

在 3.5 版更改: quiet 参数更改为多级值。

在 3.5 版更改: legacy 参数只写出 .pyc 文件,而不是 .pyo 文件,无论 optimize 的值是什么。

在 3.6 版更改: 接受 path-like object

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

使用路径 fullname 编译文件。如果文件已成功编译,则返回true值,否则返回false值。

如果给出了 ddir,它将被添加到正在编译的文件的路径以用于编译时间跟踪,并且还被编译到字节代码文件中,在那里它将被用在跟踪和其他消息中,文件在执行字节代码文件时不存在。

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

如果 quietFalse0 (默认值),则文件名和其他信息将打印到标准输出。设置为 1,只打印错误。设置为 2 时,所有输出被抑制。

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

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

3.2 新版功能.

在 3.5 版更改: quiet 参数更改为多级值。

在 3.5 版更改: legacy 参数只写出 .pyc 文件,而不是 .pyo 文件,无论 optimize 的值是什么。

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

字节编译沿 sys.path 找到的所有 .py 文件。如果所有文件都已成功编译,则返回true值,否则返回false值。

如果 skip_curdir 为true(默认值),则当前目录不包括在搜索中。所有其他参数传递到 compile_dir() 函数。注意,与其他编译函数不同,maxlevels 默认为 0

在 3.2 版更改: 添加了 legacyoptimize 参数。

在 3.5 版更改: quiet 参数更改为多级值。

在 3.5 版更改: legacy 参数只写出 .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)

# pathlib.Path objects can also be used.
import pathlib
compileall.compile_dir(pathlib.Path('Lib/'), force=True)

参见

模块 py_compile

字节编译单个源文件。