如何构造一个函数
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的
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的底部添加了一个生成 HTML 的部分,这是对第一条评论的回应。事实上,这篇文章“将 [sic] matplotlib 图嵌入 iPython HTML” 可能已经涵盖了 OP 想要的大部分内容?