[英]Is there a way to pass flags to runpy?
不使用runpy
因为它不会产生新进程( exec() )。 如果可以这样做,这个问题就会有答案。 因此,我们几乎陷入了 C 代码库或扩展世界,其中 CPython 的核心被修改为至少可以从 C API 访问,如果不能从 Python API 访问。
而是尝试使用子进程来传递标志。 可以调整输出。
如果问题是您想从进程中提取一个对象(因此子进程“失败”),您需要查看pickle
模块或简单地将其放入文件/缓冲区/套接字并检索数据 + 在自定义中重新组装方式。
Subprocess 并不是真正强制性的,但是如果有任何其他实现,它不会“破解它”,因为阻碍的是编译的核心,而不是可以被猴子修补的东西。
我想我们需要核心开发人员的新功能? :)
关于子流程输出,这对我来说很好用。
# hello.py
print("Hello")
# main.py
from subprocess import Popen, PIPE
process = Popen(
["python", "-O", "hello.py"],
stdout=PIPE, stderr=PIPE, universal_newlines=True
)
print(process.stdout.read())
这是可行的。
compile
内置函数采用优化参数。 它的值是0
就像没有-O
, 1
是-O
而2
是-OO
。
要使runpy
运行模块/路径优化,必须对其进行修补。 在此之前,我将定义两个函数进行说明。
这是一个测试模块。 如果它在没有优化的情况下运行,它将不会打印。
应用程序
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')
更新
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")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.