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 社區(qū)一直在尋求一種方法,使 Python 來替代 JavaScript 在 Web 瀏覽器中運行,而且多年來一直有各方的人在做這方面的努力。Wang 介紹的 PyScript 是一個新的框架,其建立在之前這些項目的基礎上,允許 Python 腳本直接在瀏覽器中運行;這些程序可以使用到大部分現有的 Python 生態(tài)系統(tǒng),并能夠直接與瀏覽器的文檔對象模型(DOM)進行交互。此外,作為演講的一部分,他還做了一些令人相當大開眼界的演示。

[Peter Wang]
Wang 首先介紹了他自己和他經營的公司 Anaconda,該公司是他在十年前與 Travis Oliphant 共同創(chuàng)立的。Oliphant 是 NumPy 的創(chuàng)造者,也是 SciPy 的創(chuàng)始人之一,這兩者都是 Python 科學計算生態(tài)系統(tǒng)的基石。Anaconda 創(chuàng)造了多種工具,在社區(qū)中被廣泛使用,同時還創(chuàng)立了 NumFOCUS 非營利組織和 PyData 會議。
他和 Oliphant 選擇將他們的精力集中投入在 Python 上的原因有很多,例如這種語言是平易近人的,即使是那些缺乏計算機科學背景的人也容易上手。另一個有利因素是,Python 社區(qū)通常很受歡迎,工作起來也很愉快。如果你想繼續(xù)擴大用戶群,這是一個 "真正的決定性因素"。
但從他的角度來看,該語言如此受歡迎還有另一個原因:它可以通過二進制擴展,使用 C 語言編寫的 API,但可以從其他語言訪問。他把 Python 比作 "一輛可以用螺釘來裝上曲率驅動引擎(warp drive)的本田思域"。因此,這種語言可以被孩子們接受,然后他們可以打開后備箱,"掛上曲率驅動引擎",Wang 認為在某些情況下可以讓代碼運行得比 C 或 C++更快。
這一點有時會被人們忽視,但它意味著 Python 的使用方式是其他類似語言無法比擬的。"它不只是像 Node 一樣,它不只是 Ruby 的替代品"。他說,Python 在 10 年或 15 年前被華爾街公司選中的原因就是因為這種添加曲率引擎的能力。
What sucks
他說:"在這里,在朋友之間",我們也可以討論一下這種語言的糟糕之處。盡管 Anaconda 是提供 Python 發(fā)行版的公司,但他 "可能是第一個大聲說" 安裝完所有 Python 運行所需的一切內容實在是太難了。在 Python 軟件包索引(PyPI)上有大量的軟件包,但讓它們能配合起來工作是很困難的。他說,有很多不同的工具來幫助解決這個問題,但是所有的工具都只做到了 80% 左右,所以人們在 20%的時間里有不好的體驗,這 "不是很好"。
奇怪的是,對于世界上最流行的語言(報道說 Python 是這樣的地位),卻很難編寫和發(fā)布具有用戶界面的應用程序。例如,你不能用 Python 編寫 iOS 應用程序。他說,你不能為 Windows 這個最受歡迎的企業(yè)版桌面環(huán)境創(chuàng)建一個具有用戶界面的應用程序;即使你使用網絡前端,你也必須編寫 JavaScript、CSS 和 HTML。你不能輕易用 Python 做到這些,這 "有點奇怪",但同時也 "有點意思"。
同時,在打包或者構建用戶界面上面的這兩方面的困難,使得我們很難與他人分享我們的工作,他說。對于那些將 Docker 作為解決方案的人,他說,當你用 Docker 打包一個應用程序時,你是在 "壓縮一個硬盤并把它發(fā)布給別人"。這 "不應該是我們讓數百萬人使用這些東西的主流方式"。
在很大程度上,Python 是其自身成功的受害者。它是一種優(yōu)秀的膠水語言,但這意味著它被所有這些東西粘住了。他說,我們在計算方面所做的很多事情都與 20 世紀 70 年代和 80 年代的想法和架構聯(lián)系在一起,從 C 語言和 Unix 進程模型開始;這也包括工具鏈和 TCP/IP 等互聯(lián)網協(xié)議。
他說,Python 語言的基礎知識可以在一個周末教給任何人,但要讓他們達到能夠為 Windows 創(chuàng)建可執(zhí)行文件或為 iPad 創(chuàng)建 iOS 應用程序的程度,則需要付出更大的努力。"我們能不能把 Python 從這一切中解脫出來?"
Enter WebAssembly
Wang 認為,網絡瀏覽器顯然已經贏得了操作系統(tǒng)的戰(zhàn)爭。他不知道 2022 年是否會成為 Linux 桌面的一年,[不會的。。。] 但他確實知道桌面環(huán)境上會有很多瀏覽器。在一些語言流行度調查中,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,能實現在你的本地系統(tǒng)上運行全部 JupyterLab 的功能。
Python 的核心開發(fā)者 Christian Heimes 在讓 CPython 與 WebAssembly 一起工作方面做了大量的工作,并且一直在做介紹和推廣。它將很快成為 CPython 的二級(tier-2)支持平臺,Wang 說。WebAssembly 只是提供了 x86、Arm 和其他計算機架構之外的另一種計算機架構,CPython 項目是面向這些架構的。
PyScript
因此他和 Anaconda 的同事一起在了解當前已經有哪些工作已經完成了,思考后續(xù)如何可以讓其被 "更多更多的人" 真的可以用起來。最終,他宣布了 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 功能,并且順便演示了其他一些功能。他創(chuàng)建了一個有名稱的 <div> 文件,后續(xù)用來訪問 DOM 來獲取這個 <div> 對象。同時他也使用 asyncio module 來 sleep 了一秒鐘,之后就清除了 <div> 區(qū)域,然后把所有內容放到了一個無限循環(huán)里面。這一切完成得非常完美,他笑著說:“W3C 不再讓你使用的功能,PyScript 可以幫你完成”
所以 PyScript 是一個 "在瀏覽器中創(chuàng)建豐富的 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 來執(zhí)行的,就像在 Jupyter 和其他地方一樣)。由于所有的 Python 都被加載,更復雜的應用程序可以直接在瀏覽器中運行,而不需要安裝。
他還展示了這個交互式 demo;請注意,它的加載和運行時間比先前的演示要長。他說,它的代碼在 HTML <head>部分顯示了一堆東西,這些東西最終會被清理掉,但核心代碼只是標準的 Python 數據處理代碼,使用 pandas,scikit-learn 來執(zhí)行 k-means clustering,使用了 Panel 來創(chuàng)建一個儀表盤,等等。他重申,這個文件可以直接交給同事,讓他們在自己的系統(tǒng)上運行–盡管在收集和初始化所有部件的過程中會消耗一定時間。
除此之外,還有很多有用的 JavaScript 庫可用,例如 "強大的可視化系統(tǒng)", deck.gl。他展示了一個 PyScript 的例子,使用 deck.gl 和用 Panel 創(chuàng)建的儀表盤顯示紐約市出租車數據集的數據(見下圖)。它顯示了曼哈頓島的三維柱狀圖,六邊形中的高度代表了該城市該地區(qū)的上下車數量。可以可視化的旋轉、縮放和隨時間變化的動畫;此外,bin size 可以改變,從而增加或減少地理顆粒度,點擊一個點可以顯示實際的行程細節(jié)。所有這些都是在瀏覽器中使用 Python 和 JavaScript 完成的。

[出租車數據演示]
但該演示的界面中也有 Python REPL,它可以更直接地訪問數據。pandas 數據框架可以通過 df 來訪問到,數據可以根據各種標準進行過濾,比如 "小于 5 英里的行程"(在 Python 中),然后反映在顯示中,可以像平常一樣進行交互。同樣,HTML 文件就是運行它所需要的全部內容了。PyScript 為 Python 一直以來的難題提供了一個 "戲劇性的簡化":將應用程序捆綁起來并分發(fā)給用戶。
他說,Python 從來都不是要重新實現這個世界;相反,Python 把現有的工具和庫捆綁在一起。因此,PyScript 的一名開發(fā)人員在兩天內就為 "數據驅動文檔(data-driven documents)" 建立了一個圍繞 D3.js 庫的包裝。"很多 Python 數據科學家對 D3 期待已久了"。
Python 還可以使用 PyScript 來作為多個 JavaScript 庫之間的連接渠道。他把一個 JavaScript 馬里奧游戲和一個 JavaScript 手勢識別庫混在一起,所以他的游戲在瀏覽器中運行,同時還從他的筆記本電腦的攝像頭中分析出了手勢。例如,通過分開他的手,就可以讓馬里奧跳起來。
他展示了代碼,其中有大量的 JavaScript 需要加載,來支持游戲以及手勢識別庫。但應用程序的核心是 HTML 文件中的 Python。它從手勢識別庫中獲取返回信息,來確定這應該讓馬里奧如何移動,接下來將其傳遞給游戲。因此,Python 被用來將兩個 JavaScript 庫綁定在一起,以進行 "實時攝像頭視頻識別來玩游戲"。所有這些都是 "非常酷的"。
The future
"最容易使用的網絡語言應該是我們已經喜愛和熟悉的語言;讓我們實現這一目標"。不過,除此之外,傳統(tǒng)的網絡應用是很復雜的,不僅僅是因為 JavaScript 是 "一種可怕的語言"(盡管他愿意在喝啤酒時討論這一論斷),而是因為現有的架構將應用狀態(tài)分割在客戶端和服務器之間。目前的網絡開發(fā)環(huán)境是一個工具、語言、框架等的大雜燴,"比我認為的要復雜得多"。
這種復雜性也意味著客戶端要向服務器發(fā)送大量的信息;在 20 世紀 80 年代或 90 年代,這些信息都會保留在客戶端的應用程序本身里面。向服務器發(fā)送所有這些信息是 "現代技術中許多罪惡的根源"。他想知道在瀏覽器中使用 PyScript 是否可以消除以這種與服務器對話的必要性,盡管仍然需要訪問數據庫等等;這些東西都需要弄清楚,他說。但這樣做也許可以 "帶來一個沒有 NFTs 的 Web 3 版本"。他說,這將允許建立 "合理的 client-server " 架構的應用程序,這個觀點贏得了掌聲。
Wang 說,仍然有大量的工作要做。這包括打包所有的 JavaScript 庫并使其 "更酷",可能添加對 Julia 或 R 等其他語言的支持,以及更多其他工作。還有很多有趣的問題需要解決,比如什么是 React 最漂亮的本地綁定實現,或者如何在 JavaScript 和 Python 之間來回傳輸內存才更有效率。PyScript 項目正在尋找更多的開發(fā)者來合作解決這些問題和未來的其他問題。
還有其他用 C 和 C++編寫的 Python 實現,可以編譯為 Wasm。由于許多 CPython 擴展已經支持構建為 Wasm 應用,這有可能為其他 Python 實現提供公平的競爭環(huán)境,其中大多數都不能使用基于 C 的擴展。這個巨大的擴展生態(tài)系統(tǒng)是使替代方案采用率低的部分原因,但這可能會改變。
確實有大量的項目,但社區(qū)需要對如何對他們進行開發(fā)先深思熟慮。需要考慮的是,有可能會使開發(fā)者感到疲憊。但 Wang 認為,大多數人都同意會獲得一個 "絕對巨大的" 好處。這會成為一種解決最重要問題的方法:為 99%的人編程。
因為 Python 長期以來一直專注于易學,因此作為一種教學語言,它是很平易近人的,它可以讓很多非程序員也能掌握。Python 可以被那些不認為自己是程序員但能用電腦做一些事情的人使用。他說,正是這種動力,幫助推動 Python 在過去 10 年或 15 年里在計算機語言中占據主導地位。
他指出,世界上的程序員數量約為 2500 萬,占人口的 0.3%。因此,人類的其他部分不得不依賴這一小部分人的所有代碼,而這些代碼正日益滲透到一切。"這不是一個好的狀態(tài)。" 今后將繼續(xù)保持如此,除非我們對此有所作為。
當他住在波士頓時,他被波士頓公共圖書館上的巨大雕刻所啟發(fā):"聯(lián)邦需要人民的教育作為秩序和自由的保障"。在他看來,民主化和素養(yǎng),包括計算和數據這個素質,是 "保證人類開放和自由的未來的基礎"。他希望看到 PyScript 在這方面發(fā)揮作用。"為人民和他們的社區(qū)進行計算"。
他希望孩子們能通過 PyScript 來第一次接觸到編程。他們不需要在平板電腦或筆記本電腦上安裝任何東西,或者他們可以使用圖書館的電腦。現有的關于 HTML、CSS 和 Python 的教育材料都可以繼續(xù)用,跟現在沒有什么大區(qū)別。我們的想法是關注業(yè)余程序員的生產力和生活質量,而不是經驗豐富的軟件開發(fā)人員。
他的愿景是使網絡成為 "一個友好的、可黑客化的地方,任何人都可以做出有趣的東西"。然后他們可以輕松地與他人分享這些有趣的東西。他說,在過去的 20 年里,隨著軟件棧變得越來越復雜,我們社區(qū)已經失去了 remix aspect。
他希望看到網絡回歸到以前的 quirky 和 creative 的樣子,并 "把快樂放回網絡中"。他的最后一個 "演示 "是一個 PyScript REPL,他輸入了 "import antigravity",運行后展示了關于 Python 的經典 xkcd(注意,import 也是 CPython 中的一個復活節(jié)彩蛋)。但是當他輸入 "antigravity.fly()" 時,這個飛翔的身影在一個迷你動畫中升到了更高的天空。他在雷鳴般的掌聲中說:"讓我們做更多這樣的事情"。
這是一個有趣的、相當有啟發(fā)性的主題演講,遺憾的是我直到現在才寫出來——在會議舉行差不多兩個月后。感興趣的讀者應該值得花時間觀看一下 YouTube 上的演講視頻,以了解當時 demo 的情況。嘗試一下這些例子也會有啟發(fā)的。很期待看到 PyScript 的后續(xù)發(fā)展。
[感謝 LWN 訂閱者支持作者去鹽湖城參加 PyCon。]
全文完
LWN 文章遵循 CC BY-SA 4.0 許可協(xié)議。
長按下面二維碼關注,關注 LWN 深度文章以及開源社區(qū)的各種新近言論~
