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

2024-04-28 15:21:57 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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


Tags: 项目字符串代码宠物列表进程stdout笔记本
1条回答
网友
1楼 · 发布于 2024-04-28 15:21:57

您可以使用标准库中的^{}来捕获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()
>>> b1 = Block('a = 42; print(a)')
>>> b2 = Block('print(1/a)')
>>> b1.run()
>>> b2.run()
>>> b1.output
'42\n'
>>> b2.output
'0.023809523809523808\n'

相关问题 更多 >