在python中逐块捕获输出运行python

问题描述 投票:-1回答:1

作为一个宠物项目,我想构建类似于Jupyter笔记本的东西。给定一个字符串数组,每个字符串都是Python代码的一部分,我想在单个python进程中逐个运行每个代码段,然后将输出块与每个代码段关联。我还想在另一个(父)python进程中进行全部管理。

为了使问题更明显,假设我有一个字符串列表,每个字符串都是一段python代码。一个字符串使用前面代码中的变量,即它们都应在单个进程中运行。现在,我想运行一段代码,等到完成为止,捕获输出,然后运行下一段代码,依此类推。

[不幸的是,在谷歌上搜索只是给了我一个例子,在这里我可以运行和平的代码using subprocess.Popen('python', stdout=PIPE, ...),但是使用这种方法,它将在我关闭stdin后开始执行我的命令,有效地关闭了整个python进程。

python subprocess
1个回答
1
投票

您可以使用标准库中的contextlib.redirect_stdout来捕获contextlib.redirect_stdout调用的输出。这样,您对代码块的想法(据我所知)就可以轻松实现:

exec()
import io
from contextlib import redirect_stdout

class Block:
    def __init__(self, code=''):
        self.code = code
        self.stdout = io.StringIO()

    def run(self):
        with redirect_stdout(self.stdout):
            exec(self.code, globals()) # Pass global variable dict to allow modification

    @property
    def output(self):
        return self.stdout.getvalue()
© www.soinside.com 2019 - 2024. All rights reserved.