微软的Python工程:Pyodide的可行性、用例和局限性

732 阅读6分钟

这篇博文的作者是Eleanor Boyd,2021年VS代码的Python工具的暑期实习生。

进入实习期后,你永远不知道对你的夏天会有什么期待。我绝对没有想到的是,我的整个夏天会围绕着一个库--Pyodide--而它会给我的团队和组织留下如此深刻的印象。

什么是Pyodide?

Pyodide是一个开源的库,作为Iodide项目的一部分在Mozilla开始。Pyodide允许用户通过将Python解释器编译为Web Assembly(WASM),在Web浏览器中运行Python。它的基础库中已经有75个软件包,其中大部分是科学栈的一部分,如NumPyPandas。其他软件包如果是来自PyPI的纯Python轮子,也可以安装。在这里查看Pyodide库和这里的文档。

由于我的项目是非常开放的,我想研究的问题是我的团队,即VS代码的Python工具团队,如何使用Pyodide?在网络浏览器中运行Pyodide的想法似乎很神奇,但它的工作难度如何,我们能有什么实际的原型?

我们可以看到Pyodide填补了哪些用例?

由于Python是一种非常适合初学者的语言,所以当我们考虑谁是我们的用户以及他们的需求时,我们总是把初学者的程序员和学生放在首位。我们发现,初学者在安装和配置Python时很费劲,这些步骤是他们入门的障碍。此外,我们还看到,一些限制学校计算机网络访问的学校意外地阻止了学生将Python下载到学校计算机上。这两个问题都可以通过设计一个扩展来解决,这个扩展可以通过VS Code市场访问,允许用户通过Pyodide在网上运行他们的Python代码。这是一个非常有说服力的用例,所以我开始将其作为一个选项进行探索,在这一过程中我学到了很多关于Pyodide的知识。正如你在下面的演示中所看到的,我们能够用一个扩展来解决这些问题,但这涉及到一些变通,使得它不值得生产。以下是我最大的收获和我对这个库的看法。

Prototype of running a Python file with Pyodide in VS Code 在这个演示中,用户写了一个Python程序,然后可以通过点击播放按钮并选择 "用Pyodide运行 "来使用Pyodide运行它。用户的代码是在Pyodide的猴子补丁版本中用Pyodide运行的,这使得它可以在Node中运行。代码的结果将被返回到用户的控制台,正如你所看到的,它具有强大的性能速度。

Pyodide如何工作及其局限性

VS Code是建立在Electron之上的,Electron是一种用于建立原生Node应用程序的开源技术。在尝试为VS Code编写Pyodide扩展的过程中,我发现Pyodide没有对Node的支持;它需要一个窗口对象,如果Pyodide在web worker或浏览器中运行,它就存在,但在Node中不存在。好消息是,这个问题的修复方案刚刚发布,所以我们原来的想法现在可以实现了,不需要变通了。

Pyodide的另外三个重要的考虑因素,可能是基于用例的限制,它们是:对导入第三方代码的限制,打印/返回脚本结果,以及对多文件程序的限制。Pyodide的工作方式是,你通过CDN导入Pyodide脚本,或者将库与你的应用程序捆绑在一起,尽管这将使你的项目大小增加_6.4MB_ (仅CPython标准库)或172.955MB(包含75个预装包的压缩Pyodide库)。由于这是一个基于Web的库,你的应用程序的其余部分将用JavaScript/TypeScript编写,如一个Web工作者,一个Web应用程序,或一个Node应用程序,它们都可以包含Pyodide。在导入Pyodide后,你可以使用一些简单但强大的命令来完成你对Pyodide的其他需求。你只需运行_pyodide.runPython(string of code)_并传入一串你想要运行的 Python 代码。由于Python规则适用,这应该是一个有效的Python脚本。从这里开始,Pyodide运行代码--也有一个异步命令选项--并将任何打印命令打印到控制台,并返回最终的返回值。由于这种设计,Pyodide打印的位置是基于它被调用的上下文,只有最终的返回值被运行Pyodide的主要JavaScript/TypeScript脚本所捕获。这种设计的第二个限制是,Pyodide不能处理多文件程序,因为程序是以字符串的形式传递的。与这两个限制无关的是包导入系统的设计。Pyodide捆绑了75个包,如果这些包是在线托管的纯Python轮子,无论是PyPI还是其他URL,都可以被导入。

Pyodide的优势

鉴于这些担忧,这些优势是否值得潜在的限制?我说是的(尽管我的团队对未来不做任何承诺😄 )。我认为Pyodide为Python带来了一系列全新的机会,这些机会将对所有不同类型的开发者产生巨大的影响。Pyodide的规模有点大,但它是可控的,而且该库有很好的性能速度,在我们的轻度测试中在Chrome和Edge上保持不变。由于该项目是开源的,所以在Pyodide目前的75个包列表中添加新的支持库是很简单的,而且该库总体上继续由一些核心贡献者积极维护。Pyodide repo上的活动意味着问题得到了快速的回答,并且新的功能,如Node支持,正在不断地添加到项目中。Pyodide正在不断改进,现在的限制不应该被视为静态的。

其他例子和未来的应用

本文描述的用例只是Pyodide如何帮助用户和开发者的一个引人注目的例子。我的同事Jonathan Carter在他的Twitter上演示了另一个例子,即他建立和维护的扩展CodeSwing,它允许用户在VS Code中创建/查看交互式游乐场,不需要编译,而是依靠Pyodide来运行Python代码。此外,Pyodide正在被探索为一种在VS Code中运行Python工具的方式。在实习期间,我致力于让Python的轻量级intelisense扩展工作,它使用Jedi通过Pyodide运行,而且非常简单,因为Jedi是Pyodide库中的一个包。此外,我的同事Joyce Er在她的Twitter上演示了一个个人项目,该项目使用Pyodide在笔记本中运行Python代码,由JupyterLite支持并使用VS Code API。仅仅在微软开发者部门,已经有许多使用案例证明了Pyodide的力量,如运行代码、Python工具、VS Code的交互式编码和笔记本,这些都表明如果其他组织和个人开始将Pyodide纳入他们的项目,那么Pyodide将是多么有用。Python对开发者来说是一种非常有用的语言,因为它带来了一个有用的软件包的生态系统,而Pyodide将这种力量转移到了客户身上。Pyodide可以通过在微软内部和外部的新产品中创建一个伟大的Python开发体验来解决所提出的问题,我期望随着其他用例的发现,这个库会持续增长。

Pyodide的可行性、用例和局限性》一文首次出现在Python上。