[英]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.