compileall
---字节编译python库¶
源代码: Lib/compileall.py
这个模块提供了一些实用程序功能来支持安装python库。这些函数在目录树中编译python源文件。此模块可用于在库安装时创建缓存的字节代码文件,这样即使对库目录没有写权限的用户也可以使用这些文件。
命令行使用¶
此模块可以作为脚本(使用 python -m compileall )编译python源。
- directory ...¶
- file ...¶
位置参数是要编译的文件或包含递归遍历的源文件的目录。如果没有给出参数,则表现为命令行是
-l <directories from sys.path>
.
- -l¶
不要递归到子目录中,只编译直接包含在已命名或隐含目录中的源代码文件。
- -f¶
即使时间戳是最新的,也强制重新生成。
- -q¶
不要打印编译的文件列表。如果传递一次,则仍将打印错误消息。如果通过两次 (
-qq
)所有输出被抑制。
- -d destdir¶
目录预先设置到要编译的每个文件的路径。这将出现在编译时的回溯中,并编译到字节代码文件中,在执行字节代码文件时,如果源文件不存在,则将在回溯和其他消息中使用。
- -s strip_prefix¶
- -p prepend_prefix¶
去除 (
-s
)或附加 (-p
)记录在.pyc
文件夹。不能与-d
.
- -x regex¶
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()
将被使用。
- --invalidation-mode [timestamp|checked-hash|unchecked-hash]¶
控制在运行时如何使生成的字节代码文件无效。这个
timestamp
价值,意味着.pyc
将生成嵌入源时间戳和大小的文件。这个checked-hash
和unchecked-hash
值导致生成基于hash的Pyc。基于hash的Pyc嵌入源文件内容的hash,而不是时间戳。见 缓存字节码无效 有关python如何在运行时验证字节码缓存文件的详细信息。默认值为timestamp
如果SOURCE_DATE_EPOCH
未设置环境变量,并且checked-hash
如果SOURCE_DATE_EPOCH
已设置环境变量。
- -o level¶
以给定的优化级别编译。可多次用于一次编译多个级别(例如,
compileall -o 1 -o 2
)
- -e dir¶
忽略指向给定目录外部的符号链接。
- --hardlink-dupes¶
如果两个
.pyc
不同优化级别的文件具有相同的内容,使用硬链接合并重复的文件。
在 3.2 版更改: 增加了 -i
, -b
和 -h
选项。
在 3.5 版更改: 增加了 -j
, -r
和 -qq
选项。 -q
选项已更改为多级值。 -b
将始终生成以 .pyc
永不 .pyo
.
在 3.7 版更改: 增加了 --invalidation-mode
选择权。
在 3.9 版更改: 增加了 -s
, -p
, -e
和 --hardlink-dupes
选项。将默认递归限制从10提高到 sys.getrecursionlimit()
. 添加了指定 -o
多次选择。
没有命令行选项来控制 compile()
函数,因为python解释器本身已经提供了选项: python -O -m compileall .
同样, compile()
函数尊重 sys.pycache_prefix
设置。生成的字节码缓存只有在 compile()
是用同样的 sys.pycache_prefix
(如果有)将在运行时使用。
公共职能¶
- compileall.compile_dir(dir, maxlevels=sys.getrecursionlimit(), ddir=None, force=False, rx=None, quiet=0, legacy=False, optimize=- 1, workers=1, invalidation_mode=None, *, stripdir=None, prependdir=None, limit_sl_dest=None, hardlink_dupes=False)¶
以递归方式下降目录树 dir 编译所有
.py
一路上的文件。如果所有文件编译成功,则返回一个真值,否则返回一个假值。这个 最大电平 参数用于限制递归的深度;它默认为
sys.getrecursionlimit()
.如果 ddir 给定,则它将被预先设置为要编译的每个文件的路径,以用于编译时的回溯,并被编译为字节代码文件,在执行字节代码文件时,如果源文件不存在,则它将用于回溯和其他消息。
如果 force 是真的,即使时间戳是最新的,模块也会重新编译。
如果 rx 如果给定,则在考虑编译的每个文件的完整路径上调用其搜索方法,如果返回真值,则跳过该文件。
如果 安静的 是
False
或0
(默认值)、文件名和其他信息按标准输出打印。设置为1
,只打印错误。设置为2
,所有输出被抑制。如果 legacy 如果为真,字节代码文件将被写入它们的旧位置和名称,这可能会覆盖由另一个版本的Python创建的字节代码文件。默认情况是将文件写入 PEP 3147 位置和名称,允许多个版本的python中的字节代码文件共存。
优化 指定编译器的优化级别。它被传递到内置
compile()
功能。还接受一系列优化级别,这些级别导致一个.py
在一个电话里归档。参数 工人 指定用于并行编译文件的工作线程数。默认情况下不使用多个工人。如果平台不能使用多个工人, 工人 给出了参数,然后序列编译将用作回退。如果 工人 为0,则使用系统中的核心数。如果 工人 低于
0
,AValueError
将被提升。invalidation_mode 应该是
py_compile.PycInvalidationMode
枚举并控制如何在运行时使生成的Pyc无效。这个 stripdir公司 , 前置器 和 limit_sl_dest 参数对应于
-s
,-p
和-e
上述选项。它们可以指定为str
,bytes
或os.PathLike
.如果 hardlink_dupes 是真的
.pyc
不同优化级别的文件具有相同的内容,使用硬链接合并重复的文件。在 3.2 版更改: 增加了 legacy 和 optimize 参数。
在 3.5 版更改: 增加了 workers 参数。
在 3.5 版更改: 安静的 参数已更改为多级值。
在 3.5 版更改: 这个 legacy 仅写出参数
.pyc
文件,而不是.pyo
文件无论价值多少 optimize 是。在 3.6 版更改: 接受一 path-like object .
在 3.7 版更改: 这个 invalidation_mode 已添加参数。
在 3.7.2 版更改: 这个 invalidation_mode 参数的默认值更新为“无”。
在 3.8 版更改: 设置 工人 到0现在选择最佳的核心数。
在 3.9 版更改: 补充 stripdir公司 , 前置器 , limit_sl_dest 和 hardlink_dupes 论据。默认值 最大电平 已从更改
10
到sys.getrecursionlimit()
- compileall.compile_file(fullname, ddir=None, force=False, rx=None, quiet=0, legacy=False, optimize=- 1, invalidation_mode=None, *, stripdir=None, prependdir=None, limit_sl_dest=None, hardlink_dupes=False)¶
用路径编译文件 全名 . 如果文件编译成功,则返回一个真值,否则返回一个假值。
如果 ddir 如果给定,则它将被预先设置为要编译的文件的路径,以用于编译时的回溯,并被编译为字节代码文件,在执行字节代码文件时,如果源文件不存在,则它将用于回溯和其他消息。
如果 rx 如果给定,则将其搜索方法的完整路径名传递给正在编译的文件,如果返回真值,则不会编译该文件,并且
True
返回。如果 安静的 是
False
或0
(默认值)、文件名和其他信息按标准输出打印。设置为1
,只打印错误。设置为2
,所有输出被抑制。如果 legacy 如果为真,字节代码文件将被写入它们的旧位置和名称,这可能会覆盖由另一个版本的Python创建的字节代码文件。默认情况是将文件写入 PEP 3147 位置和名称,允许多个版本的python中的字节代码文件共存。
优化 指定编译器的优化级别。它被传递到内置
compile()
功能。还接受一系列优化级别,这些级别导致一个.py
在一个电话里归档。invalidation_mode 应该是
py_compile.PycInvalidationMode
枚举并控制如何在运行时使生成的Pyc无效。这个 stripdir公司 , 前置器 和 limit_sl_dest 参数对应于
-s
,-p
和-e
上述选项。它们可以指定为str
,bytes
或os.PathLike
.如果 hardlink_dupes 是真的
.pyc
不同优化级别的文件具有相同的内容,使用硬链接合并重复的文件。3.2 新版功能.
在 3.5 版更改: 安静的 参数已更改为多级值。
在 3.5 版更改: 这个 legacy 仅写出参数
.pyc
文件,而不是.pyo
文件无论价值多少 optimize 是。在 3.7 版更改: 这个 invalidation_mode 已添加参数。
在 3.7.2 版更改: 这个 invalidation_mode 参数的默认值更新为“无”。
在 3.9 版更改: 补充 stripdir公司 , 前置器 , limit_sl_dest 和 hardlink_dupes 争论。
- compileall.compile_path(skip_curdir=True, maxlevels=0, force=False, quiet=0, legacy=False, optimize=- 1, invalidation_mode=None)¶
字节编译所有
.py
找到的文件sys.path
. 如果所有文件编译成功,则返回一个真值,否则返回一个假值。如果 skip_curdir 为true(默认值),当前目录不包括在搜索中。所有其他参数都传递给
compile_dir()
功能。注意,与其他编译函数不同,maxlevels
默认为0
.在 3.2 版更改: 增加了 legacy 和 optimize 参数。
在 3.5 版更改: 安静的 参数已更改为多级值。
在 3.5 版更改: 这个 legacy 仅写出参数
.pyc
文件,而不是.pyo
文件无论价值多少 optimize 是。在 3.7 版更改: 这个 invalidation_mode 已添加参数。
在 3.7.2 版更改: 这个 invalidation_mode 参数的默认值更新为“无”。
强制重新编译所有 .py
文件中 Lib/
子目录及其所有子目录:
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
字节编译单个源文件。