我最近偶然发现了Pyodide project。
我已经使用Pyodide构建了一个小演示,但是尽管我花了很多时间查看源代码,但对我来说,如何从python重定向print
输出(除了修改CPython源代码),以及如何将matplotlib.pyplot的输出重定向到浏览器还不明显。
从源代码来看,FigureCanvasWasm确实有一个show()
方法,该方法具有适当的后端,用于将绘图绘制到浏览器画布-但是,我不清楚如何示例化该类并调用它的show()
方法,或者是否有其他更明显的方法将绘图重定向到画布。
因此,我的问题是:
1.如何重定向print()
邮件
1.如何强制pyodide在浏览器中绘制matplotlib图形?
下面是我的测试页面:
<!doctype html>
<meta charset="utf-8">
<html lang="en">
<html>
<head>
<title>Demo</title>
<script src="../../pyodide/build/pyodide.js"></script>
</head>
<body>
</body>
<script type="text/javascript">
languagePluginLoader.then(() => {
pyodide.loadPackage(['matplotlib']).then(() => {
pyodide.runPython(`
import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4])
plt.ylabel('some numbers')
#fig = plt.gcf()
#fig.savefig(imgdata, format='png')
print('Done from python!')`
);
//var image = pyodide.pyimport('imgdata');
//console.log(image);
});});
</script>
<html>
4条答案
按热度按时间de90aj5v1#
首先,让我们看看是否可以在浏览器中显示任何内容;例如一个普通的字符串,Python变量存储在
pyodide.globals
属性中,因此我们可以从那里获取python对象并将其放入页面上的<div>
元素中。现在我想我们可以对matplotlib图做同样的事情。下面将显示文档中保存的png图像。
我还没有研究过
backends.wasm_backend
,所以这可能会允许一种更自动化的方式。vc9ivgsu2#
当使用WASM后端时,图形的canvas属性是FigureCanvasWasm的示例。调用canvas的
show()
方法应该足以在浏览器中显示图形。不幸的是,canvas的create_root_element()
方法中的一个小错误阻止了图形的显示。此方法创建了一个将包含图形的div
元素。它首先尝试创建一个碘化物输出div元素,如果失败,则创建一个普通的HTML div元素,但是这个元素不会附加到文档中,因此保持不可见。下面是FigureCanvasWasm中发生这种情况时的代码行
注解表明,非iodide代码是一个存根,需要通过覆盖方法来扩展,这需要将FigureCanvasWasm子类化,将其安装为pyodide模块,并配置matplotlib以使用后端。
但是,有一个捷径,因为python允许覆盖示例的方法,而不修改类,如问题394770所示。
最初工具栏没有显示图标,我不得不下载、解压缩并安装fontawesome以及pyodide,并在标题中包含以下行来获得这些图标
编辑:关于问题的第一部分,将输出流重定向到浏览器,您可以看看在pyodide的console.html中是如何完成的。
它用StringIO对象替换sys.stdout
然后运行Python代码(可以完全忽略它是在WASM上下文中运行的事实)
最后,将stdout缓冲区的内容发送到输出元素
xytpbqjk3#
要显示来自pyodide的print()调用,可以使用loadPyodide上的参数来重定向stdout:
https://github.com/pyodide/pyodide/blob/main/src/js/pyodide.js
ws51t4hk4#
我为Python创建了一个简单的交互式shell,如果你需要更详细的信息,请阅读tutorial。
下面是
matplotlib
的例子,注意这将加载一堆依赖项,这将花费几分钟的时间。一个二个一个一个