编译python源代码

编译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()
posted @ 2020-10-28 16:46  Lowell  阅读(977)  评论(0编辑  收藏  举报