如何构造一个 python 函数,其中 python 代码中的输入和输出是 ipython 丰富的输出(HTML 格式)?

问题描述 投票:0回答:1

如何构造一个函数

foo()
使得

pycode = '''
from matplotlib import pyplot as plt
plt.plot([1, 2, 3])
plt.show()
'''

out = foo(pycode)

其中

out
是ipython或jupyter笔记本将输出的富文本HTML输出

ipython 中是否有一些内置函数可以做到这一点?我猜是有的,但我在谷歌上找不到它。

编辑:我希望该函数存在于我的 python 脚本中,而不是当我运行 ipython shell 时

编辑:我想做的是本质上重新创建类似 jupyter 笔记本单元的东西,我给它代码,它会像 jupyter 笔记本单元一样直观地返回丰富的输出(可能以 HTML 形式)。

python html jupyter ipython
1个回答
2
投票

我想你正在寻找Python的

exec()
方法?

在安装了 matplotlib 的 JupyterLab 中,您可以在单元格中运行它并查看下面的输出:

pycode = '''
from matplotlib import pyplot as plt
plt.plot([1, 2, 3])
plt.show()
'''
out = exec(pycode)

请记住,通常不鼓励使用

exec()
以及相关的
eval()
使用它们可能会导致其他人(甚至是您)无意中执行您不想运行的代码,从而导致严重问题。通常,如果您使用正确的方法,则无需使用它们,请参阅此处。 (看来您现在甚至可以使用基于 WebAssembly 的 Python 来完成此操作,请参阅PyScript:是否可以执行上传的 Python 脚本?。)


更新第一条评论:

如所写,尽管代码可以绘制情节,但

out
没有收集任何内容,因为
exec(pycode)
恰好在最后一行。有一种方法可以在使用 IPython 的捕获实用程序运行时收集 RichOutput。因为它通过导入工作,所以如果你也安装了 Jupyter 生态系统,它应该可以在 Python 中工作。换句话说,虽然我在笔记本中演示它,但您可以创建一个函数来使用
return captured.outputs[0]
,它将从绘图中返回 RichOutput。

在本笔记本中更详细地了解潜在的推理

注意,因为我处理 RichOutput 并制作图像,所以您还想查看其中的参考资料。里面还有很多东西我就不说了。


制作一个简单的功能并且不使用
exec()

请参阅以编程方式制作

.py
文件在此处的示例笔记本中。通常,您可以在文本编辑器中通过手动写入保存文本来创建这样的文件,例如以下另存为
plot_func.py
:

def my_plot_func():
    from matplotlib import pyplot as plt
    plt.plot([1, 2, 3])
    plt.savefig('my_plot_via_func.png')

然后导入并运行。该过程的一部分会保存文件的图像。在笔记本中,显示该图像文件

my_plot_via_func.png

这是最简单的版本。导入和执行该函数将在终端或其他地方以相同的方式在纯 Python 中运行,直到显示图像文件。如果您将绘图作为绘图对象(图形)返回,则需要某种方式来显示。这在 Jupyter 中有效,但在纯 Python 中无效。

我添加这个是因为我仍然不清楚你想做什么。我有一个更高级的版本,您可以在其中提供专门组织的 Pandas 数据框并获取专门的绘图。要尝试它,请转到此处,然后按

launch binder
,然后完成课程开始时出现的示例笔记本。也许这会帮助你更好地询问你想要什么。特别是因为它需要类似“这个绘图脚本,其中所有内容都经过硬编码”,并将其概括为一个版本,其中它是命令行脚本或您可以调用的函数。您会在下面的评论中看到我所说的基础设施是必要的。命令行脚本也使用纯 python 运行。你会看到我在笔记本中通常使用%run,因为它功能更全面;但是,在笔记本中,如果您可以牺牲更好的输出处理并且不需要像
!python
那样在笔记本命名空间中运行脚本,则通常可以用
%run
替换
%run -i
有关使用 matplotlib 绘图来编写由其他人返回专门绘图的代码的示例,请参阅

此处

生成 HTML

OP 想要 HTML,我在

主要示例笔记本

的底部添加了一个生成 HTML 的部分,这是对第一条评论的回应。事实上,这篇文章“将 [sic] matplotlib 图嵌入 iPython HTML” 可能已经涵盖了 OP 想要的大部分内容?

© www.soinside.com 2019 - 2024. All rights reserved.