LWN:介绍 PyScript!

2023-10-21 14:10
文章标签 介绍 lwn pyscript

本文主要是介绍LWN:介绍 PyScript!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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)进行交互。此外,作为演讲的一部分,他还做了一些令人相当大开眼界的演示。

dbf1e8d71e5af26d5b90a99bd16f0953.png

[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 完成的。

16867c3cb5be341e5e4923cc9cc437d9.png

[出租车数据演示]

但该演示的界面中也有 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 深度文章以及开源社区的各种新近言论~

format,png

这篇关于LWN:介绍 PyScript!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/254896

相关文章

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

Mysql BLOB类型介绍

BLOB类型的字段用于存储二进制数据 在MySQL中,BLOB类型,包括:TinyBlob、Blob、MediumBlob、LongBlob,这几个类型之间的唯一区别是在存储的大小不同。 TinyBlob 最大 255 Blob 最大 65K MediumBlob 最大 16M LongBlob 最大 4G

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

nginx介绍及常用功能

什么是nginx nginx跟Apache一样,是一个web服务器(网站服务器),通过HTTP协议提供各种网络服务。 Apache:重量级的,不支持高并发的服务器。在Apache上运行数以万计的并发访问,会导致服务器消耗大量内存。操作系统对其进行进程或线程间的切换也消耗了大量的CPU资源,导致HTTP请求的平均响应速度降低。这些都决定了Apache不可能成为高性能WEB服务器  nginx:

多路转接之select(fd_set介绍,参数详细介绍),实现非阻塞式网络通信

目录 多路转接之select 引入 介绍 fd_set 函数原型 nfds readfds / writefds / exceptfds readfds  总结  fd_set操作接口  timeout timevalue 结构体 传入值 返回值 代码 注意点 -- 调用函数 select的参数填充  获取新连接 注意点 -- 通信时的调用函数 添加新fd到

火语言RPA流程组件介绍--浏览网页

🚩【组件功能】:浏览器打开指定网址或本地html文件 配置预览 配置说明 网址URL 支持T或# 默认FLOW输入项 输入需要打开的网址URL 超时时间 支持T或# 打开网页超时时间 执行后后等待时间(ms) 支持T或# 当前组件执行完成后继续等待的时间 UserAgent 支持T或# User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器