On this page
compileall —字节编译 Python 库
源代码: Lib/compileall.py
该模块提供了一些 Util Function来支持安装 Python 库。这些函数在目录树中编译 Python 源文件。此模块可用于在库安装时创建缓存的字节码文件,从而使这些文件甚至可供没有库目录写权限的用户使用。
Command-line use
这个模块可以作为脚本(使用 python -m compileall )来编译 Python 源代码。
directory
...
file
...
- 位置参数是要编译的文件或包含源文件的目录,这些文件是递归遍历的。如果未提供任何参数,则其行为就像命令行是
-l <directories from sys.path>
。
- 位置参数是要编译的文件或包含源文件的目录,这些文件是递归遍历的。如果未提供任何参数,则其行为就像命令行是
-l
``- 不要递归到子目录,而只能编译直接包含在命名或隐含目录中的源代码文件。
-f
``- 即使时间戳是最新的,也要强制重建。
-q
``- 不要打印已编译文件的列表。如果pass一次,错误消息仍将被打印。如果pass两次(
-qq
),将禁止所有输出。
- 不要打印已编译文件的列表。如果pass一次,错误消息仍将被打印。如果pass两次(
-d
destdir
- 目录位于要编译的每个文件的路径之前。这将出现在编译时回溯中,并且也将编译到字节码文件中,在执行字节码文件时源文件不存在的情况下,它将在回溯和其他消息中使用。
-x
regex
- regex 用于搜索要考虑编译的每个文件的完整路径,如果 regex 产生匹配项,则跳过该文件。
-i
list
- 读取文件
list
并将其包含的每一行添加到要编译的文件和目录列表中。如果list
是-
,则从stdin
读取行。
- 读取文件
-b
``- 将字节代码文件写入其原有位置和名称,这可能会覆盖由另一个版本的 Python 创建的字节代码文件。默认设置是将文件写入其 PEP 3147的位置和名称,这允许来自多个 Python 版本的字节码文件共存。
-r
``- 控制子目录的最大递归级别。如果提供此选项,则将不考虑
-l
选项。 python -m compileall -r 0 等效于 python -m compileall -l 。
- 控制子目录的最大递归级别。如果提供此选项,则将不考虑
-j
N
- 使用* N *个工作程序来编译给定目录中的文件。如果使用
0
,则将使用os.cpu_count()的结果。
- 使用* N *个工作程序来编译给定目录中的文件。如果使用
--invalidation-mode
[timestamp|checked-hash|unchecked-hash]
- 控制如何在运行时使生成的字节码文件无效。
timestamp
值,表示将生成嵌入了源时间戳和大小的.pyc
文件。checked-hash
和unchecked-hash
值会导致生成基于哈希的 pycs。基于散列的 pycs 嵌入源文件内容的散列,而不是时间戳。有关 Python 如何在运行时验证字节码缓存文件的更多信息,请参见缓存的字节码无效。如果未设置SOURCE_DATE_EPOCH
环境变量,则默认值为timestamp
;如果已设置SOURCE_DATE_EPOCH
环境变量,则默认值为checked-hash
。
- 控制如何在运行时使生成的字节码文件无效。
在版本 3.2 中进行了更改:添加了-i
,-b
和-h
选项。
在版本 3.5 中进行了更改:添加了-j
,-r
和-qq
选项。 -q
选项已更改为多级值。 -b
将始终产生以.pyc
结尾的字节码文件,而不是.pyo
。
在 3.7 版中进行了更改:添加了--invalidation-mode
选项。
没有命令行选项可控制compile()函数使用的优化级别,因为 Python 解释器本身已经提供了以下选项: python -O -m compileall 。
同样,compile()函数遵循sys.pycache_prefix设置。仅当compile()与将在运行时使用的sys.pycache_prefix(如果有)相同时运行,生成的字节码缓存才有用。
Public functions
compileall.
compile_dir
(* dir , maxlevels = 10 , ddir = None , force = False , rx = None , quiet = 0 , legacy = False , optimize = -1 *, * workers = 1 , invalidation_mode = None *)- 递归地以* dir *命名的目录树,编译整个
.py
文件。如果所有文件编译成功,则返回 true,否则返回 false。
- 递归地以* dir *命名的目录树,编译整个
- maxlevels *参数用于限制递归的深度;默认为
10
。
如果给定了* ddir *,它会被添加到要编译的每个文件的路径中,以供在编译时回溯中使用,并且还会被编译为字节码文件,在以下情况下,它将在回溯和其他消息中使用:执行字节码文件时源文件不存在。
如果* force *为 true,则即使时间戳是最新的,也将重新编译模块。
如果给定了* rx *,则在要考虑编译的每个文件的完整路径上调用其搜索方法,如果返回的是 true 值,则跳过该文件。
如果* quiet *是False
或0
(默认值),则文件名和其他信息将按标准输出。设置为1
,仅打印错误。设置为2
,将抑制所有输出。
如果* legacy *为 true,则将字节代码文件写入其旧位置和名称,这可能会覆盖由另一个版本的 Python 创建的字节代码文件。默认设置是将文件写入其 PEP 3147的位置和名称,这允许来自多个 Python 版本的字节码文件共存。
- optimize *指定编译器的优化级别。它被传递给内置的compile()函数。
参数* workers 指定使用多少个 worker 并行编译文件。默认为不使用多个工作程序。如果平台不能使用多个 worker 并且给出了 workers 参数,那么 Sequences 编译将用作后备。如果 workers 为 0,则使用系统中的内核数。如果 workers *低于0
,则将引发ValueError。
- invalidation_mode *应该是py_compile.PycInvalidationMode枚举的成员,并控制如何在运行时使生成的 pycs 无效。
在 3.2 版中进行了更改:添加了* legacy 和 optimize *参数。
在版本 3.5 中进行了更改:添加了* workers *参数。
在版本 3.5 中进行了更改:* quiet *参数已更改为多级值。
在版本 3.5 中更改:* legacy 参数仅写出.pyc
个文件,而不写.pyo
个文件,无论 optimize *的值是多少。
在版本 3.6 中更改:接受path-like object。
在版本 3.7 中更改:添加了* invalidation_mode *参数。
在版本 3.7.2 中进行了更改:* invalidation_mode *参数的默认值更新为 None。
在 3.8 版中进行了更改:现在将* workers *设置为 0 可以选择最佳的内核数量。
compileall.
compile_file
(* fullname , ddir = None , force = False , rx = None , quiet = 0 , legacy = False , optimize = -1 , invalidation_mode = None *)- 使用路径* fullname *编译文件。如果文件编译成功,则返回 true 值,否则返回 false 值。
如果给定了* ddir *,它会被放在要编译的文件的路径中,以供在编译时回溯中使用,并且还会被编译为字节码文件,在以下情况下,它将在回溯和其他消息中使用:执行字节码文件时源文件不存在。
如果给定了* rx *,则其搜索方法会将完整路径名传递给正在编译的文件,如果返回的是 true 值,则不编译该文件并返回True
。
如果* quiet *是False
或0
(默认值),则文件名和其他信息将按标准输出。设置为1
,仅打印错误。设置为2
,将抑制所有输出。
如果* legacy *为 true,则将字节代码文件写入其旧位置和名称,这可能会覆盖由另一个版本的 Python 创建的字节代码文件。默认设置是将文件写入其 PEP 3147的位置和名称,这允许来自多个 Python 版本的字节码文件共存。
optimize *指定编译器的优化级别。它被传递给内置的compile()函数。
invalidation_mode *应该是py_compile.PycInvalidationMode枚举的成员,并控制如何在运行时使生成的 pycs 无效。
3.2 版中的新Function。
在版本 3.5 中进行了更改:* quiet *参数已更改为多级值。
在版本 3.5 中更改:* legacy 参数仅写出.pyc
个文件,而不写.pyo
个文件,无论 optimize *的值是多少。
在版本 3.7 中更改:添加了* invalidation_mode *参数。
在版本 3.7.2 中进行了更改:* invalidation_mode *参数的默认值更新为 None。
compileall.
compile_path
(* skip_curdir = True , maxlevels = 0 , force = False , quiet = 0 , legacy = False , optimize = -1 , invalidation_mode = None *)- 字节编译
sys.path
中找到的所有.py
文件。如果所有文件编译成功,则返回 true,否则返回 false。
- 字节编译
如果* skip_curdir *为 true(默认值),则当前目录不包括在搜索中。所有其他参数都传递给compile_dir()函数。请注意,与其他编译函数不同,maxlevels
默认为0
。
在 3.2 版中进行了更改:添加了* legacy 和 optimize *参数。
在版本 3.5 中进行了更改:* quiet *参数已更改为多级值。
在版本 3.5 中更改:* legacy 参数仅写出.pyc
个文件,而不写.pyo
个文件,无论 optimize *的值是多少。
在版本 3.7 中更改:添加了* invalidation_mode *参数。
在版本 3.7.2 中进行了更改:* invalidation_mode *参数的默认值更新为 None。
要强制重新编译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)
See also
Module py_compile
字节编译单个源文件。