有没有办法将标志传递给 runpy?
Is there a way to pass flags to runpy?
我正在寻找一种方法来传递 miscellaneous options using runpy 或其他工具。
特别是,我想在另一个未优化的 python 脚本中获得优化的 python 脚本的输出。
python -O tobeoptimized.py
我试过使用子进程,但我无法像在 runpy 中那样提取我需要的对象。
from subprocess import PIPE, run
command = ['python','-O','tobeoptimized.py']
result = run(command, stdout=PIPE, stderr=PIPE, universal_newlines=True)
不用runpy
because it isn't spawning a new process, (exec()). If it could have been done this way, this question就有答案了。
所以我们几乎陷入了 C 代码库或扩展世界,其中 CPython 的 core 被修改为至少可以从 C [=] 访问的方式32=] 如果不是来自 Python API.
改为尝试使用子进程来传递标志。输出可以调整。
如果问题是你想从进程中提取一个对象(因此子进程“失败”),你需要查看 pickle
模块或简单地将它放到 file/buffer/socket并检索数据 + 以自定义方式重新组合。
子进程并不是真正强制性的,但是如果有任何其他实现,它不会“砍掉它”,因为它是编译核心,而不是可以猴子修补的东西。
我想我们需要核心开发人员的新功能? :)
关于子进程输出,这对我来说很好。
# 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
内置函数采用 optimize 参数。它的值是 0
就像没有 -O
,1
是 -O
和 2
是 -OO
。
要优化 runpy
运行 模块/路径,必须对其进行修补。在此之前,我将定义两个函数以供说明。
这是一个测试模块。如果它是 运行 没有优化它不会打印。
app.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')
更新
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")
我正在寻找一种方法来传递 miscellaneous options using runpy 或其他工具。
特别是,我想在另一个未优化的 python 脚本中获得优化的 python 脚本的输出。
python -O tobeoptimized.py
我试过使用子进程,但我无法像在 runpy 中那样提取我需要的对象。
from subprocess import PIPE, run
command = ['python','-O','tobeoptimized.py']
result = run(command, stdout=PIPE, stderr=PIPE, universal_newlines=True)
不用runpy
because it isn't spawning a new process, (exec()). If it could have been done this way, this question就有答案了。
所以我们几乎陷入了 C 代码库或扩展世界,其中 CPython 的 core 被修改为至少可以从 C [=] 访问的方式32=] 如果不是来自 Python API.
改为尝试使用子进程来传递标志。输出可以调整。
如果问题是你想从进程中提取一个对象(因此子进程“失败”),你需要查看 pickle
模块或简单地将它放到 file/buffer/socket并检索数据 + 以自定义方式重新组合。
子进程并不是真正强制性的,但是如果有任何其他实现,它不会“砍掉它”,因为它是编译核心,而不是可以猴子修补的东西。
我想我们需要核心开发人员的新功能? :)
关于子进程输出,这对我来说很好。
# 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
内置函数采用 optimize 参数。它的值是 0
就像没有 -O
,1
是 -O
和 2
是 -OO
。
要优化 runpy
运行 模块/路径,必须对其进行修补。在此之前,我将定义两个函数以供说明。
这是一个测试模块。如果它是 运行 没有优化它不会打印。
app.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')
更新
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")