作为一个宠物项目,我想构建类似于Jupyter笔记本的东西。给定一个字符串数组,每个字符串都是Python代码的一部分,我想在单个python进程中逐个运行每个代码段,然后将输出块与每个代码段关联。我还想在另一个(父)python进程中进行全部管理。
为了使问题更明显,假设我有一个字符串列表,每个字符串都是一段python代码。一个字符串使用前面代码中的变量,即它们都应在单个进程中运行。现在,我想运行一段代码,等到完成为止,捕获输出,然后运行下一段代码,依此类推。
[不幸的是,在谷歌上搜索只是给了我一个例子,在这里我可以运行和平的代码using subprocess.Popen('python', stdout=PIPE, ...)
,但是使用这种方法,它将在我关闭stdin后开始执行我的命令,有效地关闭了整个python进程。
您可以使用标准库中的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()