这是可行的。内置函数采用
优化参数。它的值就像没有, is和is 。
要优化运行模块/路径,必须对其进行修补。在此之前,我将定义两个函数进行说明。compile
0
-O
1
-O
2
-OO
runpy
这是一个测试模块。如果它在没有优化的情况下运行,它将不会打印。
应用程序.py
assert 0, "assert zero"
print("Optimized")
这两个函数并没有像现在那样做所有的细节runpy
。所以不能完全发挥作用。
import importlib
import runpy
optimize = 1
def run_module(mod_name):
spec = importlib.util.find_spec(mod_name)
source = spec.loader.get_source(spec.name)
code = compile(source, spec.name + ".py", "exec", optimize=optimize)
d = {}
exec(code, d)
return d
def run_path(path):
with open(path) as f:
source = f.read()
code = compile(source, path, "exec", optimize=optimize)
d = {}
exec(code, d)
return d
这是修补一个函数,runpy
用于runpy.run_module
获取要运行的模块的代码对象。该补丁提供了优化的代码对象。
import runpy
optimize = 1
def _get_module_details_wrapper(func):
def tmp(*args, **kwargs):
mod_name, spec, _ = func(*args, **kwargs)
source = spec.loader.get_source(spec.name)
code = compile(source, spec.name + ".py", "exec", optimize=optimize)
return mod_name, spec, code
return tmp
runpy._get_module_details = _get_module_details_wrapper(runpy._get_module_details)
runpy.run_module('app')
UPDATE
runpy.run_path
可以在优化开启的情况下运行。
def optimize_compile(o):
from functools import partial
import builtins
builtins.compile = partial(compile, optimize=o)
optimize_compile(1)
runpy.run_path("app.py")
optimize_compile(0)
try:
runpy.run_path("app.py")
except AssertionError:
print("assertion")
optimize_compile(1)
runpy.run_path("app.py")