32.11. compileall —字节编译 Python 库

源代码: Lib/compileall.py


该模块提供了一些 Util Function来支持安装 Python 库。这些函数在目录树中编译 Python 源文件。此模块可用于在库安装时创建缓存的字节码文件,从而使这些文件甚至可供没有库目录写权限的用户使用。

32.11.1. 命令行使用

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

  • directory ...

  • file ...

    • 位置参数是要编译的文件或包含源文件的目录,这些文件是递归遍历的。如果未提供任何参数,则其行为就像命令行是-l <directories from sys.path>
  • -l ``

    • 不要递归到子目录,而只能编译直接包含在命名或隐含目录中的源代码文件。
  • -f ``

    • 即使时间戳是最新的,也要强制重建。
  • -q ``

    • 不要打印已编译文件的列表,仅打印错误消息。
  • -d destdir

    • 目录位于要编译的每个文件的路径之前。这将出现在编译时回溯中,并且也将编译到字节码文件中,在执行字节码文件时源文件不存在的情况下,它将在回溯和其他消息中使用。
  • -x regex

    • regex 用于搜索要考虑编译的每个文件的完整路径,如果 regex 产生匹配项,则跳过该文件。
  • -i list

    • 读取文件list并将其包含的每一行添加到要编译的文件和目录列表中。如果list-,则从stdin读取行。

在 2.7 版中进行了更改:添加了-i选项。

32.11.2. 公共职能

  • compileall. compile_dir(* dir * [,* maxlevels * [,* ddir * [,* force * [,* rx * [,* quiet *]]]]])
    • 递归地以* dir *命名的目录树,编译整个.py文件。
  • maxlevels *参数用于限制递归的深度;默认为10

如果给定了* ddir *,它会被添加到要编译的每个文件的路径中,以供在编译时回溯中使用,并且还会被编译为字节码文件,在以下情况下,它将在回溯和其他消息中使用:执行字节码文件时源文件不存在。

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

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

如果* quiet *为 true,则除非发生错误,否则什么都不会打印到标准输出。

  • compileall. compile_file(* fullname * [,* ddir * [,* force * [,* rx * [,* quiet *]]]])
    • 使用路径* fullname *编译文件。

如果给定了* ddir *,它会被放在要编译的文件的路径中,以供在编译时回溯中使用,并且还会被编译为字节码文件,在以下情况下,它将在回溯和其他消息中使用:执行字节码文件时源文件不存在。

如果给定* rx *,则其搜索方法会将完整路径名传递给正在编译的文件,如果返回的是 true 值,则不编译该文件,并返回True

如果* quiet *为 true,则除非发生错误,否则什么都不会打印到标准输出。

2.7 版的新Function。

  • compileall. compile_path([* skip_curdir * [,* maxlevels * [,* force *]]])
    • 字节编译sys.path中找到的所有.py文件。如果* skip_curdir *为 true(默认值),则当前目录不包括在搜索中。所有其他参数都传递给compile_dir()函数。请注意,与其他编译函数不同,maxlevels默认为0

要强制重新编译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)

See also

  • Module py_compile

  • 字节编译单个源文件。