LWN:介绍 PyScript!

Linux News搬运工

共 8113字,需浏览 17分钟

 ·

2022-07-07 21:35

关注了就能看到更多这么棒的文章哦~

Introducing PyScript

By Jake Edge
June 22, 2022
PyCon
DeepL assisted translation
https://lwn.net/Articles/898452/

在犹他州盐湖城举行的 PyCon 2022 的主题演讲中,Peter Wang 介绍了浏览器内 Python 解释器领域的另一个解决方案。长期以来,Python 社区一直在寻求一种方法,使 Python 来替代 JavaScript 在 Web 浏览器中运行,而且多年来一直有各方的人在做这方面的努力。Wang 介绍的 PyScript 是一个新的框架,其建立在之前这些项目的基础上,允许 Python 脚本直接在浏览器中运行;这些程序可以使用到大部分现有的 Python 生态系统,并能够直接与浏览器的文档对象模型(DOM)进行交互。此外,作为演讲的一部分,他还做了一些令人相当大开眼界的演示。

[Peter Wang]

Wang 首先介绍了他自己和他经营的公司 Anaconda,该公司是他在十年前与 Travis Oliphant 共同创立的。Oliphant 是 NumPy 的创造者,也是 SciPy 的创始人之一,这两者都是 Python 科学计算生态系统的基石。Anaconda 创造了多种工具,在社区中被广泛使用,同时还创立了 NumFOCUS 非营利组织和 PyData 会议。

他和 Oliphant 选择将他们的精力集中投入在 Python 上的原因有很多,例如这种语言是平易近人的,即使是那些缺乏计算机科学背景的人也容易上手。另一个有利因素是,Python 社区通常很受欢迎,工作起来也很愉快。如果你想继续扩大用户群,这是一个 "真正的决定性因素"。

但从他的角度来看,该语言如此受欢迎还有另一个原因:它可以通过二进制扩展,使用 C 语言编写的 API,但可以从其他语言访问。他把 Python 比作 "一辆可以用螺钉来装上曲率驱动引擎(warp drive)的本田思域"。因此,这种语言可以被孩子们接受,然后他们可以打开后备箱,"挂上曲率驱动引擎",Wang 认为在某些情况下可以让代码运行得比 C 或 C++更快。

这一点有时会被人们忽视,但它意味着 Python 的使用方式是其他类似语言无法比拟的。"它不只是像 Node 一样,它不只是 Ruby 的替代品"。他说,Python 在 10 年或 15 年前被华尔街公司选中的原因就是因为这种添加曲率引擎的能力。

What sucks

他说:"在这里,在朋友之间",我们也可以讨论一下这种语言的糟糕之处。尽管 Anaconda 是提供 Python 发行版的公司,但他 "可能是第一个大声说" 安装完所有 Python 运行所需的一切内容实在是太难了。在 Python 软件包索引(PyPI)上有大量的软件包,但让它们能配合起来工作是很困难的。他说,有很多不同的工具来帮助解决这个问题,但是所有的工具都只做到了 80% 左右,所以人们在 20%的时间里有不好的体验,这 "不是很好"。

奇怪的是,对于世界上最流行的语言(报道说 Python 是这样的地位),却很难编写和发布具有用户界面的应用程序。例如,你不能用 Python 编写 iOS 应用程序。他说,你不能为 Windows 这个最受欢迎的企业版桌面环境创建一个具有用户界面的应用程序;即使你使用网络前端,你也必须编写 JavaScript、CSS 和 HTML。你不能轻易用 Python 做到这些,这 "有点奇怪",但同时也 "有点意思"。

同时,在打包或者构建用户界面上面的这两方面的困难,使得我们很难与他人分享我们的工作,他说。对于那些将 Docker 作为解决方案的人,他说,当你用 Docker 打包一个应用程序时,你是在 "压缩一个硬盘并把它发布给别人"。这 "不应该是我们让数百万人使用这些东西的主流方式"。

在很大程度上,Python 是其自身成功的受害者。它是一种优秀的胶水语言,但这意味着它被所有这些东西粘住了。他说,我们在计算方面所做的很多事情都与 20 世纪 70 年代和 80 年代的想法和架构联系在一起,从 C 语言和 Unix 进程模型开始;这也包括工具链和 TCP/IP 等互联网协议。

他说,Python 语言的基础知识可以在一个周末教给任何人,但要让他们达到能够为 Windows 创建可执行文件或为 iPad 创建 iOS 应用程序的程度,则需要付出更大的努力。"我们能不能把 Python 从这一切中解脱出来?"

Enter WebAssembly

Wang 认为,网络浏览器显然已经赢得了操作系统的战争。他不知道 2022 年是否会成为 Linux 桌面的一年,[不会的。。。] 但他确实知道桌面环境上会有很多浏览器。在一些语言流行度调查中,JavaScript 是最强者,因为它是浏览器的原生语言。他说,因此,如果我们想进入这个领域,WebAssembly(也就是 Wasm)显然是正确的答案。

WebAssembly "从根本上改变了玩法"。它是一个虚拟的 CPU 指令集,最近成为了 W3C 标准;它有一个 32 位的地址空间,可以做 64 位的运算。有一个编译工具,Emscripten,可以用来将大多数 C 和 C++代码编译成 WebAssembly,然后可以在浏览器中运行。WebAssembly 得到了浏览器的良好支持,包括手机上的移动浏览器,Wang 说。

CPython 毕竟是一个 C 语言程序,Python 数值计算软件栈的大部分内容都是用 C 或 C++编写的。在过去的几年里,像 Pyodide(LWN 在一年多以前介绍过)和 JupyterLite 这样的项目一直在试着把 Python 科学和数值计算软件栈的大部分内容都改得适合 WebAssembly。

如果你去 Pyodide 网站,你可以在你的浏览器中得到一个 Python read-eval-print loop(REPL)。从我们熟悉的"三个可爱的> 符号" 界面,你可以 import NumPy 和 pandas。在 JupyterLite 网站,你可以在浏览器中得到一个 notebook,能实现在你的本地系统上运行全部 JupyterLab 的功能。

Python 的核心开发者 Christian Heimes 在让 CPython 与 WebAssembly 一起工作方面做了大量的工作,并且一直在做介绍和推广。它将很快成为 CPython 的二级(tier-2)支持平台,Wang 说。WebAssembly 只是提供了 x86、Arm 和其他计算机架构之外的另一种计算机架构,CPython 项目是面向这些架构的。

PyScript

因此他和 Anaconda 的同事一起在了解当前已经有哪些工作已经完成了,思考后续如何可以让其被 "更多更多的人" 真的可以用起来。最终,他宣布了 PyScript, 不过他的宣布方式是在演讲台上现场写了一个 "hello world" 的 demo 程序。这是他第一次在 PyCon 上做 keynote 主题演讲,“没准也是最后一次”,他一边笑着说,一边写了一个用来从 pyscript.net 加载 pyscript.js 文件(使用了<script> tag)的简短的 HTML 文件,这个文件主题内容很简单:

<py-script>
print("Hello PyCon 2022!")
</py-script>

接下来他双击此文件,在浏览器就出现了这句问候语,这时台下就有了一轮掌声。不过他说,这还仅仅是 HTML,接下来他把这段代码用 <blink> tag 括了起来,然后重新加载了这个页面。不过,目前这个 <blink> tag 已经不再被 HTML 所支持了,很可惜。他说:“现在我不得不给孩子们解释一下现在已经没有 <blink> tag ”了。

接下来他就对这个 PyScript 代码添加 blinking 功能,并且顺便演示了其他一些功能。他创建了一个有名称的 <div> 文件,后续用来访问 DOM 来获取这个 <div> 对象。同时他也使用 asyncio module 来 sleep 了一秒钟,之后就清除了 <div> 区域,然后把所有内容放到了一个无限循环里面。这一切完成得非常完美,他笑着说:“W3C 不再让你使用的功能,PyScript 可以帮你完成”

所以 PyScript 是一个 "在浏览器中创建丰富的 Python 应用程序的框架"。它允许 Python 和 HTML 交错使用,提供对 DOM 的完全访问,并使代码能够访问 JavaScript 库。这是双向进行的。Python 代码可以调用 JavaScript,也可以从 JavaScript 中被调用。因此,所有的应用逻辑和代码都可以用同一种语言了,在浏览器中运行就行,不需要在网络服务器上运行了。你可以把 HTML 文件放在一个 U 盘上,然后交给你的朋友。当然有必要下载 PyScript 本身,但这是在 HTML 文件中使用<script>标签就可以完成的。

PyScript 不是 CPython 的某个 fork 版本,它与与会者在笔记本电脑和服务器上运行的代码相同,Wang 说,只是编译的时候改为了针对 Wasm。它包括了 Pyodide 为了让主要的数值计算、科学和大数据包也能在 Wasm 上运行而做的所有工作。PyScript 是一个 "有意见的框架(opinionated framework)",它提供了一个外部函数接口(FFI)来与 JavaScript 和 DOM 对话;Python 已经包装了 C、C++和 Fortran,所以 JavaScript 也可以被加入到这个列表中。"这是真正的无服务器(serverless)计算"。

More demos

他还做了其他一些小演示,其中许多来自 PyScript 的 example 页面。他从一个 REPL 开始,在输入 print()调用显示<iframe>HTML 标签之前,输入了几个简单的 Python 语句,接着在浏览器窗口中播放了一段视频。他说:"这是我忽悠人时观众人数最多的一次",引来了笑声和掌声。

他还展示了一个简单的待办事项应用程序,并对代码进行了一番探究。该 HTML 文件有一些模板(boilerplate),然后设置了文本输入框和 "添加任务" 按钮。该按钮有一个 PyScript 特有的 pys-onClick 属性,它有一个 Python 函数的名字,当按钮被点击时会被调用。为方便起见,Python 代码放在了一个单独的包含了该函数的 todo.py 文件中。

应用程序本身允许向 todo list 中添加事项,这也会在它们旁边放一个复选框。当复选框被点击时,列表中的条目也会被加上一条删除线。所有这些都可以在 Python 中通过操作 DOM 来很容易地实现,正如在代码中可以看到的那样。

PyScript 的 JavaScript 和 CSS 文件可以从本地或从 pyscript.net 加载。来自 Python 的输出可以被 route 到不同的地方,这意味着 stdout 和 stderr 可以放 page 的不同位置,就像在 REPL2 例子中做的那样(注意需要使用 shift-enter 来执行的,就像在 Jupyter 和其他地方一样)。由于所有的 Python 都被加载,更复杂的应用程序可以直接在浏览器中运行,而不需要安装。

他还展示了这个交互式 demo;请注意,它的加载和运行时间比先前的演示要长。他说,它的代码在 HTML <head>部分显示了一堆东西,这些东西最终会被清理掉,但核心代码只是标准的 Python 数据处理代码,使用 pandas,scikit-learn 来执行 k-means clustering,使用了 Panel 来创建一个仪表盘,等等。他重申,这个文件可以直接交给同事,让他们在自己的系统上运行–尽管在收集和初始化所有部件的过程中会消耗一定时间。

除此之外,还有很多有用的 JavaScript 库可用,例如 "强大的可视化系统", deck.gl。他展示了一个 PyScript 的例子,使用 deck.gl 和用 Panel 创建的仪表盘显示纽约市出租车数据集的数据(见下图)。它显示了曼哈顿岛的三维柱状图,六边形中的高度代表了该城市该地区的上下车数量。可以可视化的旋转、缩放和随时间变化的动画;此外,bin size 可以改变,从而增加或减少地理颗粒度,点击一个点可以显示实际的行程细节。所有这些都是在浏览器中使用 Python 和 JavaScript 完成的。

[出租车数据演示]

但该演示的界面中也有 Python REPL,它可以更直接地访问数据。pandas 数据框架可以通过 df 来访问到,数据可以根据各种标准进行过滤,比如 "小于 5 英里的行程"(在 Python 中),然后反映在显示中,可以像平常一样进行交互。同样,HTML 文件就是运行它所需要的全部内容了。PyScript 为 Python 一直以来的难题提供了一个 "戏剧性的简化":将应用程序捆绑起来并分发给用户。

他说,Python 从来都不是要重新实现这个世界;相反,Python 把现有的工具和库捆绑在一起。因此,PyScript 的一名开发人员在两天内就为 "数据驱动文档(data-driven documents)" 建立了一个围绕 D3.js 库的包装。"很多 Python 数据科学家对 D3 期待已久了"。

Python 还可以使用 PyScript 来作为多个 JavaScript 库之间的连接渠道。他把一个 JavaScript 马里奥游戏和一个 JavaScript 手势识别库混在一起,所以他的游戏在浏览器中运行,同时还从他的笔记本电脑的摄像头中分析出了手势。例如,通过分开他的手,就可以让马里奥跳起来。

他展示了代码,其中有大量的 JavaScript 需要加载,来支持游戏以及手势识别库。但应用程序的核心是 HTML 文件中的 Python。它从手势识别库中获取返回信息,来确定这应该让马里奥如何移动,接下来将其传递给游戏。因此,Python 被用来将两个 JavaScript 库绑定在一起,以进行 "实时摄像头视频识别来玩游戏"。所有这些都是 "非常酷的"。

The future

"最容易使用的网络语言应该是我们已经喜爱和熟悉的语言;让我们实现这一目标"。不过,除此之外,传统的网络应用是很复杂的,不仅仅是因为 JavaScript 是 "一种可怕的语言"(尽管他愿意在喝啤酒时讨论这一论断),而是因为现有的架构将应用状态分割在客户端和服务器之间。目前的网络开发环境是一个工具、语言、框架等的大杂烩,"比我认为的要复杂得多"。

这种复杂性也意味着客户端要向服务器发送大量的信息;在 20 世纪 80 年代或 90 年代,这些信息都会保留在客户端的应用程序本身里面。向服务器发送所有这些信息是 "现代技术中许多罪恶的根源"。他想知道在浏览器中使用 PyScript 是否可以消除以这种与服务器对话的必要性,尽管仍然需要访问数据库等等;这些东西都需要弄清楚,他说。但这样做也许可以 "带来一个没有 NFTs 的 Web 3 版本"。他说,这将允许建立 "合理的 client-server " 架构的应用程序,这个观点赢得了掌声。

Wang 说,仍然有大量的工作要做。这包括打包所有的 JavaScript 库并使其 "更酷",可能添加对 Julia 或 R 等其他语言的支持,以及更多其他工作。还有很多有趣的问题需要解决,比如什么是 React 最漂亮的本地绑定实现,或者如何在 JavaScript 和 Python 之间来回传输内存才更有效率。PyScript 项目正在寻找更多的开发者来合作解决这些问题和未来的其他问题。

还有其他用 C 和 C++编写的 Python 实现,可以编译为 Wasm。由于许多 CPython 扩展已经支持构建为 Wasm 应用,这有可能为其他 Python 实现提供公平的竞争环境,其中大多数都不能使用基于 C 的扩展。这个巨大的扩展生态系统是使替代方案采用率低的部分原因,但这可能会改变。

确实有大量的项目,但社区需要对如何对他们进行开发先深思熟虑。需要考虑的是,有可能会使开发者感到疲惫。但 Wang 认为,大多数人都同意会获得一个 "绝对巨大的" 好处。这会成为一种解决最重要问题的方法:为 99%的人编程。

因为 Python 长期以来一直专注于易学,因此作为一种教学语言,它是很平易近人的,它可以让很多非程序员也能掌握。Python 可以被那些不认为自己是程序员但能用电脑做一些事情的人使用。他说,正是这种动力,帮助推动 Python 在过去 10 年或 15 年里在计算机语言中占据主导地位。

他指出,世界上的程序员数量约为 2500 万,占人口的 0.3%。因此,人类的其他部分不得不依赖这一小部分人的所有代码,而这些代码正日益渗透到一切。"这不是一个好的状态。" 今后将继续保持如此,除非我们对此有所作为。

当他住在波士顿时,他被波士顿公共图书馆上的巨大雕刻所启发:"联邦需要人民的教育作为秩序和自由的保障"。在他看来,民主化和素养,包括计算和数据这个素质,是 "保证人类开放和自由的未来的基础"。他希望看到 PyScript 在这方面发挥作用。"为人民和他们的社区进行计算"。

他希望孩子们能通过 PyScript 来第一次接触到编程。他们不需要在平板电脑或笔记本电脑上安装任何东西,或者他们可以使用图书馆的电脑。现有的关于 HTML、CSS 和 Python 的教育材料都可以继续用,跟现在没有什么大区别。我们的想法是关注业余程序员的生产力和生活质量,而不是经验丰富的软件开发人员。

他的愿景是使网络成为 "一个友好的、可黑客化的地方,任何人都可以做出有趣的东西"。然后他们可以轻松地与他人分享这些有趣的东西。他说,在过去的 20 年里,随着软件栈变得越来越复杂,我们社区已经失去了 remix aspect。

他希望看到网络回归到以前的 quirky 和 creative 的样子,并 "把快乐放回网络中"。他的最后一个 "演示 "是一个 PyScript REPL,他输入了 "import antigravity",运行后展示了关于 Python 的经典 xkcd(注意,import 也是 CPython 中的一个复活节彩蛋)。但是当他输入 "antigravity.fly()" 时,这个飞翔的身影在一个迷你动画中升到了更高的天空。他在雷鸣般的掌声中说:"让我们做更多这样的事情"。

这是一个有趣的、相当有启发性的主题演讲,遗憾的是我直到现在才写出来——在会议举行差不多两个月后。感兴趣的读者应该值得花时间观看一下 YouTube 上的演讲视频,以了解当时 demo 的情况。尝试一下这些例子也会有启发的。很期待看到 PyScript 的后续发展。

[感谢 LWN 订阅者支持作者去盐湖城参加 PyCon。]

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~



浏览 31
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报