繁体   English   中英

通过块捕获输出在 python 块中运行 python

[英]Running python in python block by block capturing the output

作为一个宠物项目,我想构建一个类似于 Jupyter notebook 的东西。 给定一个字符串数组,每个字符串都是一个和平的python代码,我想在一个python进程中一个一个地运行每个片段,然后将输出块与每个代码片段关联起来。 我还想在另一个(父)python 进程中管理它。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM