compileall
— 字节编译 Python 库
¶
源代码: Lib/compileall.py
此模块提供一些实用函数来支持安装 Python 库。这些函数编译目录树下的 Python 源文件。此模块可以用于在库安装时创建缓存字节码文件,即使用户没有库目录写入权限也可以使用它们。
此模块可以作为脚本工作 (使用 python -m compileall ) 以编译 Python 源代码。
directory
...
¶
file
...
¶
Positional arguments are files to compile or directories that contain source files, traversed recursively. If no argument is given, behave as if the command line was
-l <directories from sys.path>
.
-l
¶
Do not recurse into subdirectories, only compile source code files directly contained in the named or implied directories.
-f
¶
Force rebuild even if timestamps are up-to-date.
-q
¶
Do not print the list of files compiled. If passed once, error messages will still be printed. If passed twice (
-qq
),所有输出被抑制。
-d
destdir
¶
Directory prepended to the path to each file being compiled. This will appear in compilation time tracebacks, and is also compiled in to the byte-code file, where it will be used in tracebacks and other messages in cases where the source file does not exist at the time the byte-code file is executed.
-x
regex
¶
regex is used to search the full path to each file considered for compilation, and if the regex produces a match, the file is skipped.
-i
list
¶
读取文件
list
and add each line that it contains to the list of files and directories to compile. If
list
is
-
,读取行从
stdin
.
-b
¶
Write the byte-code files to their legacy locations and names, which may overwrite byte-code files created by another version of Python. The default is to write files to their PEP 3147 locations and names, which allows byte-code files from multiple versions of Python to coexist.
-r
¶
Control the maximum recursion level for subdirectories. If this is given, then
-l
option will not be taken into account.
python -m compileall <directory> -r 0
相当于
python -m compileall <directory> -l
.
-j
N
¶
使用
N
workers to compile the files within the given directory. If
0
is used, then the result of
os.cpu_count()
会被使用。
--invalidation-mode
[timestamp|checked-hash|unchecked-hash]
¶
Control how the generated byte-code files are invalidated at runtime. The
timestamp
value, means that
.pyc
files with the source timestamp and size embedded will be generated. The
checked-hash
and
unchecked-hash
values cause hash-based pycs to be generated. Hash-based pycs embed a hash of the source file contents rather than a timestamp. See
缓存字节码无效
for more information on how Python validates bytecode cache files at runtime. The default is
timestamp
若
SOURCE_DATE_EPOCH
environment variable is not set, and
checked-hash
若
SOURCE_DATE_EPOCH
environment variable is set.
3.2 版改变:
添加
-i
,
-b
and
-h
选项。
3.5 版改变:
添加
-j
,
-r
,和
-qq
选项。
-q
option was changed to a multilevel value.
-b
will always produce a byte-code file ending in
.pyc
, never
.pyo
.
3.7 版改变:
添加
--invalidation-mode
选项。
There is no command-line option to control the optimization level used by the
compile()
function, because the Python interpreter itself already provides the option:
python -O -m compileall
.
同样,
compile()
函数遵守
sys.pycache_prefix
设置。生成的字节码缓存才有用若
compile()
的运行是采用相同
sys.pycache_prefix
(if any) that will be used at runtime.
compileall.
compile_dir
(
dir
,
maxlevels=10
,
ddir=None
,
force=False
,
rx=None
,
quiet=0
,
legacy=False
,
optimize=-1
,
workers=1
,
invalidation_mode=None
)
¶
Recursively descend the directory tree named by
dir
, compiling all
.py
files along the way. Return a true value if all the files compiled successfully, and a false value otherwise.
The
maxlevels
parameter is used to limit the depth of the recursion; it defaults to
10
.
若 ddir is given, it is prepended to the path to each file being compiled for use in compilation time tracebacks, and is also compiled in to the byte-code file, where it will be used in tracebacks and other messages in cases where the source file does not exist at the time the byte-code file is executed.
若 force is true, modules are re-compiled even if the timestamps are up to date.
若 rx is given, its search method is called on the complete path to each file considered for compilation, and if it returns a true value, the file is skipped.
若
quiet
is
False
or
0
(the default), the filenames and other information are printed to standard out. Set to
1
, only errors are printed. Set to
2
, all output is suppressed.
若 legacy is true, byte-code files are written to their legacy locations and names, which may overwrite byte-code files created by another version of Python. The default is to write files to their PEP 3147 locations and names, which allows byte-code files from multiple versions of Python to coexist.
optimize
specifies the optimization level for the compiler. It is passed to the built-in
compile()
函数。
自变量
workers
specifies how many workers are used to compile files in parallel. The default is to not use multiple workers. If the platform can’t use multiple workers and
workers
argument is given, then sequential compilation will be used as a fallback. If
workers
is 0, the number of cores in the system is used. If
workers
is lower than
0
,
ValueError
会被引发。
invalidation_mode
should be a member of the
py_compile.PycInvalidationMode
enum and controls how the generated pycs are invalidated at runtime.
3.2 版改变: 添加 legacy and optimize 参数。
3.5 版改变: 添加 workers 参数。
3.5 版改变: quiet 参数被改成多级值。
3.5 版改变:
The
legacy
参数仅写入输出
.pyc
files, not
.pyo
files no matter what the value of
optimize
is.
3.6 版改变: 接受 像路径对象 .
3.7 版改变: The invalidation_mode 参数被添加。
3.7.2 版改变: The invalidation_mode 参数的默认值被更新为 None。
3.8 版改变: 设置 workers to 0 now chooses the optimal number of cores.
compileall.
compile_file
(
fullname
,
ddir=None
,
force=False
,
rx=None
,
quiet=0
,
legacy=False
,
optimize=-1
,
invalidation_mode=None
)
¶
Compile the file with path fullname . Return a true value if the file compiled successfully, and a false value otherwise.
若 ddir is given, it is prepended to the path to the file being compiled for use in compilation time tracebacks, and is also compiled in to the byte-code file, where it will be used in tracebacks and other messages in cases where the source file does not exist at the time the byte-code file is executed.
若
rx
is given, its search method is passed the full path name to the file being compiled, and if it returns a true value, the file is not compiled and
True
被返回。
若
quiet
is
False
or
0
(the default), the filenames and other information are printed to standard out. Set to
1
, only errors are printed. Set to
2
, all output is suppressed.
若 legacy is true, byte-code files are written to their legacy locations and names, which may overwrite byte-code files created by another version of Python. The default is to write files to their PEP 3147 locations and names, which allows byte-code files from multiple versions of Python to coexist.
optimize
specifies the optimization level for the compiler. It is passed to the built-in
compile()
函数。
invalidation_mode
should be a member of the
py_compile.PycInvalidationMode
enum and controls how the generated pycs are invalidated at runtime.
3.2 版新增。
3.5 版改变: quiet 参数被改成多级值。
3.5 版改变:
The
legacy
参数仅写入输出
.pyc
files, not
.pyo
files no matter what the value of
optimize
is.
3.7 版改变: The invalidation_mode 参数被添加。
3.7.2 版改变: The invalidation_mode 参数的默认值被更新为 None。
compileall.
compile_path
(
skip_curdir=True
,
maxlevels=0
,
force=False
,
quiet=0
,
legacy=False
,
optimize=-1
,
invalidation_mode=None
)
¶
字节编译所有
.py
files found along
sys.path
. Return a true value if all the files compiled successfully, and a false value otherwise.
若
skip_curdir
is true (the default), the current directory is not included in the search. All other parameters are passed to the
compile_dir()
function. Note that unlike the other compile functions,
maxlevels
默认为
0
.
3.2 版改变: 添加 legacy and optimize 参数。
3.5 版改变: quiet 参数被改成多级值。
3.5 版改变:
The
legacy
参数仅写入输出
.pyc
files, not
.pyo
files no matter what the value of
optimize
is.
3.7 版改变: The invalidation_mode 参数被添加。
3.7.2 版改变: The invalidation_mode 参数的默认值被更新为 None。
要强制重新编译所有
.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
字节编译单个源文件。