我们很乐意宣布,斑德已成为一个独立和社区驱动的项目。我们也很高兴地宣布为粘性的0.17释放,具有许多新功能和改进。
Pyodide由CPython 3.8解释器编译成WebasseMbly,它允许Python在浏览器中运行。许多流行的科学Python软件包也已编译并提供。此外,Pyodide可以使用Python包索引(PYPI)的纯Python轮安装任何Python包。 Pyodide还包括一个全面的外函数界面,它将Python软件包的生态系统暴露给JavaScript和浏览器用户界面,包括DOM到Python。
您可以直接在浏览器中尝试最新版本的Pyodide。
我们很高兴地宣布,Pyodide现在在单独的GitHub组织(GitHub.com/pyodide)中有一个新的家园,并由派遣国志愿者队维护。 Pyodide.org上有项目文档可用。
斑岩最初是在Mozilla内开发的,以允许在碘化物中使用Python,这是一种实验努力为网络构建互动科学计算环境。自初始发布和公告以来,Pyodide引起了社区的大量兴趣,仍然积极开发,并用于Mozilla以外的许多项目。
核心团队已批准透明的治理文件,并具有未来发展的路线图。 Pyodide还有一个行为准则,我们希望所有贡献者和核心成员都坚持。
欢迎新贡献者参加GitHub上的项目开发。有许多方法可以贡献,包括代码贡献,文档改进,添加包,以及使用Pyodide进行应用程序并提供反馈。
类型的翻译模块在V0.17中得到了大大重新改造,目标是Python和JavaScript之间对象的往返翻译产生相同的对象。
换句话说,python - > JS - > Python翻译和js - > Python - > JS转换现在生成等于原始对象的对象。 (由于不可避免的设计权衡,这仍然存在几例。)
Pyodide的优势之一是Python和JavaScript之间的外函数接口,其最佳可以几乎可以删除使用两种不同语言的精神开销。所有I / O必须通过通常的Web API,因此为了使Python代码利用浏览器的优势,我们需要能够支持使用像在Python中生成图像数据的用例并将数据呈现为HTML5画布,或在Python中实现事件处理程序。
在过去,我们发现,当一个对象从Python到JavaScript并回到Python并回来不同时,使用粘合剂中的一个主要疼痛点发生一个主要的疼痛点。这违反了用户的期望和强制厌资格的解决方法。
往返翻译的问题主要是由Python类型的隐性转换为JavaScript引起的。隐式转换旨在方便,但系统对用户来说是不灵活和令人惊讶的。我们仍然隐含地转换字符串,数字,布尔值,而不是。使用允许方法和某些操作从其他语言调用的代理在语言之间共享大多数其他对象。可以将代理转换为本机类型,具有名为.tojs和to_py的新的显式转换器方法。
>>>来自js导入x#导入x来自全局javascript范围和gt;>型(x)<类' Jsproxy'>>> x [0]#可以直接索引x' a'>> X [1] =' C' #修改x>>> x.to_py()#将x转换为python列表[' a'' c']
添加了几种其他转换方法以进行更复杂的用例。这使用户更精细地控制类型转换而不是以前可能的。
例如,假设我们有一个Python列表,并且希望将其用作预期数组的JavaScript函数的参数。呼叫者或海尔利需要照顾转换。这允许我们直接呼叫不知道粘性的功能。
以下是将Python调用JavaScript函数的示例,在Python Side上具有参数转换:
函数jsfunc(array){array.push(2); return array.length; length;} pyodide.runpython(来自js导入jsfuncfrom pyodide导入to_jsdef pyfunc():mylist = [1,2,3] jslist = to_js(mylist)return jsfunc(jslist)#返回返回4`)
在jsfunc是内置javascript的情况下,这将运作良好,并且pyfunc是我们的代码库的一部分。如果pyfunc是python包的一部分,我们可以在javascript中处理转换:
另一个主要的新功能是实现一个Python事件循环,该循环计划在浏览器事件循环上运行的coroutines。这使得可以在Pyodide中使用异步。
此外,现在可以等待Python中的JavaScript并等待在JavaScript中等待Python。这允许在Python和JavaScript中的Asyncio之间的无缝互操作性(尽管在复杂的用例中可能出现内存管理问题)。
以下是一个示例,在其中我们定义了一个Python异步函数,该函数等待JavaScript async函数“fetch”,然后我们等待来自javascript的python异步函数。
pyodide.runpython(`async def test():从js导入fetch#fetch the pyodide包列表r = await fetch(" packages.json")data = await r.json()#返回所有可用包返回data.dependencies.object_keys()`);让test = pyodide.globals.get("测试"); //我们可以等待javascriptresult = await test()的coroutine;控制台。日志(结果); //日志[" asciitree"" acco&#34 ;," scikit-learn" ...]
现在可以在Python中抛出错误,并捕获JavaScript或抛出JavaScript并捕获在Python中。对此的支持是集成在最低级别,因此JavaScript和C函数之间的呼叫按预期行为。错误转换代码由C宏生成,这使得实现和调试新的逻辑更简单。
函数JSError(){抛出新错误(" ooops!");} pyodide.runpython(来自js导入jserrorfrom pyodide导入jsexceptiontry:jserror()除了作为e:print的e:print(str(e)) #pings" typeerror:ooops!"`);
Pyodide使用EMScripten编译器工具链接来编译CPython 3.8解释器和Python软件包,将C扩展到Webassembly。在此版本中,我们最终完成了迁移到使用上游LLVM后端的最新版本的EMScripten。这使我们能够利用最近对工具链的改进,包括封装大小和执行时间的显着缩短。
例如,SciPy包从92 MB缩小到15 MB,因此SCIPY现在被浏览器缓存。这极大地提高了依赖于Scipy的科学Python软件包的可用性,例如Scikit-Image和Scikit-Learn。仅具有CPython标准库的基础曲面环境的大小从8.1 MB缩小到6.4 MB。
在性能方面,最新的工具链有25%至30%的运行时间改进:
根据基准测试,在近3至5倍之间的性能范围较慢。以上基准测试是使用Firefox 87创建的。
添加了对MicroPIP和LoadPackage中的相对URL的支持,并改进了微皮和载荷之间的交互
添加到C代码的系统错误处理,包括JavaScript错误和CPython错误之间的自动适配器
添加了内部一致性检查以检测内存泄漏,检测到致命错误,并提高轻松调试
Mozilla使得艰难决定沿着碘化项目卷积。虽然alpha.iodide.io现在将继续使用(部分是为了提供Pyodide的能力的演示),但我们不建议将其使用它以便在未来关闭。自从碘化物版本以来,在创建基于Pyodide的交互式笔记本环境中,在主动开发中创建了许多努力,并提供了使用Python在浏览器中创建交互式可视化的类似环境。
虽然在此版本中解决了许多问题,但在路线图上存在许多其他主要步骤。我们可以提及
例如,更好的项目可持续性通过寻求与公务员伪造项目及其工具的协同作用。
Dexter Chua和Joe Marshall改进构建设置并使Emscripten迁移成为可能。