首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法把旗子传递给runpy?

有没有办法把旗子传递给runpy?
EN

Stack Overflow用户
提问于 2021-07-12 10:30:17
回答 2查看 633关注 0票数 10

我正在寻找一种使用杂项选择或其他工具传递颠簸的方法。

特别是,我希望在另一个非优化的python脚本中获得优化的python脚本的输出。

代码语言:javascript
复制
python -O tobeoptimized.py

我尝试过使用子进程,但是我不能像在runpy中那样提取我需要的对象。

代码语言:javascript
复制
from subprocess import PIPE, run
command = ['python','-O','tobeoptimized.py']
result = run(command, stdout=PIPE, stderr=PIPE, universal_newlines=True)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-20 06:11:59

是可行的。

compile内置函数采用优化参数.它的值是1和2。如果它是0 (不包括-O ),那么1-O2是命令行上的-OO

要使runpy运行模块/路径优化,必须对其进行修补。在此之前,我将定义两个函数以进行说明。

这是一个测试模块。如果它在没有优化的情况下运行,就不会打印。

app.py

代码语言:javascript
复制
assert 0, "assert zero"
print("Optimized")

这两个函数并不像runpy那样处理所有细节。所以不能充分发挥作用。

代码语言:javascript
复制
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使用它来获取模块的代码对象以运行。该修补程序提供优化的代码对象。

代码语言:javascript
复制
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可以在打开优化时运行。

代码语言:javascript
复制
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")
票数 5
EN

Stack Overflow用户

发布于 2021-07-14 13:51:19

而不是runpy,因为它是不会产生一个新的过程,(主管())。如果能这样做的话,这个问题就有了答案。因此,我们几乎陷入了C代码库或扩展世界,在这种情况下,CPython的核心被修改,如果不是从Python,至少可以从can访问。

相反,尝试使用子进程传递标志。输出可以调整。

如果问题是要从进程中提取对象(因此子进程“失败”),则需要查看pickle模块,或者简单地将其放到文件/缓冲器/套接字中,并以自定义的方式检索数据+重新组装。

Subprocess并不是强制性的,但是如果有其他的实现,它不会“黑掉它”,因为它是受编译的核心阻碍,而不是可以被猴子修补掉的东西。

我想我们需要一个来自核心开发者的新特性?:)

关于子进程输出,这对我来说很好。

代码语言:javascript
复制
# hello.py
print("Hello")
代码语言:javascript
复制
# main.py
from subprocess import Popen, PIPE

process = Popen(
    ["python", "-O", "hello.py"],
    stdout=PIPE, stderr=PIPE, universal_newlines=True
)
print(process.stdout.read())
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68345812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档