编译python源代码
使用py_compile库。
PyCompileError
尝试编译文件时发生错误时引发异常。
py_compile.PyCompileError
compile
压缩后的pyc文件默认保存在文件所在目录下的__pycache__
目录下。
py_compile.compile(file, cfile=None, dfile=None, doraise=False, optimize=-1, invalidation_mode=PycInvalidationMode.TIMESTAMP, quiet=0)
参数描述:
file:python的源代码文件
cfile:
dfile:如果指定了 dfile,则它用作错误消息中的源文件的名称
doraise:如果doraise为 true,则在编译文件时遇到错误时引发PyCompileError
。 如果doraise为 false(默认值),则将错误字符串写入文件 ,但不会引发异常。
optimize:最优化控制最优化级别,并传递给内置的compile()函数。 缺省值为选择当前解释器的优化级别。-1
invalidation_mode:是PycInvalidationMode枚举的成员,并控制如何在运行时使生成的字节码缓存无效。 如果设置了环境变量,则默认值为PycInvalidationMode.CHECKED_HASH,否则默认值为PycInvalidationMode.TIMESTAMP.SOURCE_DATE_EPOCH
PycInvalidationMode
解释器可以用来确定字节码文件是否与源文件最新的方法的枚举。
-
TIMESTAMP
该文件包括源文件的时间戳和大小,Python 将在运行时与源文件的元数据进行比较,以确定是否需要重新生成该文件。
.pyc
-
CHECKED_HASH
该文件包括源文件内容的哈希值,Python 将在运行时与源进行比较,以确定是否需要重新生成该文件。
.pyc
-
UNCHECKED_HASH
与
CHECKED_HASH
一样,该文件包括源文件内容的哈希。但是,Python 将在运行时假定该文件是最新的,并且不会根据源文件验证 。.pyc
当 Python 外部某些系统(如生成系统)保持最新时,此选项很有用。.pycs
main
py_compile.main(args=None)
编译几个源文件。 编译以args命名的文件(如果args是,则在命令行上),然后以常规方式缓存生成的字节码。 该功能不会搜索目录结构来查找源文件; 它仅编译显式命名的文件。 如果是args中的唯一参数,则文件列表取自标准输入。
命令行简单编译单个文件
python -m py_compile test.py
编译所有文件
官网:https://docs.python.org/3/library/compileall.html#module-compileall
在命令行中使用compileall
如下使用示例:
$ python -m compileall -h
命令行参数
-r:控制子目录的最大递归级别。 如果给出此选项,则不会考虑该选项。
python -m compileall <目录> -r 0
等效于python -m compileall <目录> -l
-o:使用给定的优化级别编译。可多次用于编译多个级别compileall -o 1 -o 2
-x:用于排除,正则表达式用于搜索考虑编译的每个文件的完整路径,如果正则表达式生成匹配项,则跳过该文件。
要强制重新编译子目录中的所有文件及其所有子目录,.pyLib/
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)
compile_dir()
可以遍历目录然后做二进制的编译。
如下代码:
import compileall
compileall.compile_dir('examples')
要过滤不必要的目录,可以使用rx参数提供一个正则表达式来排除不需要的目录。
import compileall
import re
compileall.compile_dir('examples', rx=re.compile(r'/.svn'))
maxlevels参数可以控制目录树递归的层级数,例如,不需要递归可以将maxlevels参数设置为0
import compileall
import re
compileall.compile_dir('examples', maxlevels=0, rx=re.compile(r'/.svn'))
编译sys.path中包含的所有目录:
通过调用compile_path()
可以编译sys.path中包含的所有目录
import compileall
import sys
sys.path[:] = ['examples', 'notthere']
print('sys.path =', sys.path)
compileall.compile_path()