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

在python中逐块运行python以捕获输出,python,subprocess,Python,Subprocess,作为一个宠物项目,我想构建一些类似于Jupyter笔记本的东西。给定一个字符串数组,每个字符串都是python代码,我希望在单个python进程中逐个运行每个字符串,然后将输出块与每个代码关联起来。我还想在另一个(父级)python进程中管理这一切 为了使问题具体化,假设我有一个字符串列表,每个字符串都是一段python代码。一个字符串使用前一段代码中的变量,即它们都应该在单个进程中运行。现在我想运行一段代码,等待它完成,捕获输出,然后运行下一段,依此类推 不幸的是,谷歌搜索只给了我一个例子,在

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

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

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

您可以使用标准库捕获
exec()
调用的输出。因此,您的代码块(据我所知)的想法很容易实现:

导入io
从contextlib导入重定向\u stdout
类块:
定义初始化(self,代码=“”):
self.code=代码
self.stdout=io.StringIO()
def运行(自):
使用重定向标准输出(self.stdout):
exec(self.code,globals())#传递全局变量dict以允许修改
@财产
def输出(自):
返回self.stdout.getvalue()
b1=块('a=42;打印(a)' >>>b2=块(‘打印(1/a)’) >>>b1.run() >>>b2.run() >>>b1.产量 “42\n” >>>b2.1输出 “0.023809523809523808\n”
如果您还希望进程能够“共享”变量,那么将每一行隔离到一个单独的进程有什么意义?只需使用
eval(…)按顺序执行每个字符串如何
?如果需要,在单个子流程中?@jordanm,我真的不想孤立每一个部分,我只想知道一个部分的输出和另一个部分的输出。也就是说,我想将输出块与每段代码相关联。@Seb,老实说,我没有考虑
eval(…)
,但我如何才能捕获eval的输出?我想我错过了重要的一点,我想将输出块与每段代码相关联。补充到问题上。非常感谢,这是我希望有人指导我的方向。再加上
多处理
,它很好地解决了这个问题!