ブラウザでPythonを実行できるPyScript
PyCon US 2022が、4月27日~5月3日に開催されていますが、そのキーノートで、PyScriptというプロジェクトが、AnacondaのCEO、Peter Wang氏から発表され、私のTwitter界隈では大きく注目されています。 今回は、Pythonの旬の話題として、PyScriptを取り上げようと思います。
なお、まだ発表されて間もないなので、本記事に誤り・語弊があれば追って修正します(ご指摘ください)。
What's this
PyScriptは、Pythonをブラウザで実行できるようにするものです。
公式ページはこちらです。元々GitHubのリポジトリがAnacondaのグループ下にあったため、開発は恐らくAnacondaが主導していると思います。
ブラウザで実行できるプログラムと言えばJavaScriptですが、そのJavaScriptと同じようにブラウザで実行することが出来ます。
例えば、このような感じです(こちらの記事の著者のGistです)。
上の例では、PyScriptのコードは、CDNからダウンロードしているので、ローカルで何かインストールする必要はありません。
一応、PyScriptのコードはZipでも提供されているので、それをダウンロードし、解凍して、PyScriptのコードパスをHTML内で参照すれば利用できます(が、ドキュメントに書かれているpyscript.css
とpyscript.js
が見つからない…のでCDN利用するのが無難です)。
HTMLに、<py-script>
と書いて、Pythonのコードを入れ込めています。
FirefoxとChromeで実行してみた所、Hello Worldのみで概ね数秒かかりました。
これだけでは面白くないので、PyScriptのZipの中に入っているexampleから、d3jsでパイチャートを描画するページも表示してみましょう。
左がJavaScriptで、右がPyScriptです。PyScriptの方が後から描画されます。
ちなみに、Pythonでpip installして利用しているサードパーティのモジュールを利用することも可能です。
<head>
の中で、以下のコードを書けば、そこに指定されたモジュールが、<py-script>
内で利用できます。
<py-env> - numpy - matplotlib </py-env>
ただ、恐らく、PyPIで公開されている全モジュールが利用可能ということはないだろうと思われます。
また、<py-script output=”plot”>
とすると、Jupyter notebookなどで表示できるグラフのプロットを、Webページでも表示することが出来ます。
How does it work
からくりとしては、PyScriptは、PythonのコードをWebAssemblyにコンパイルして実行しています。 PyScriptは、PythonのコードをWebAssemblyにコンパイルして実行するPyodideという別プロジェクトを利用しています。 Pyodideは、PythonのコードをEmscriptenでWebAssemblyのコードにコンパイルしWebAssemblyで実行するものです。CPythonのWebAssembly版といった位置づけです。
HTMLを開くと、PyScriptからPyodideがダウンロード/実行され、<py-script>
内のPythonコードが、WebAssemblyにコンパイルされます。その後、それをブラウザが実行します。
この構造のため、私はベンチマークは取ってませんが、Pythonのコードはそれなりに早く実行されると思われます。
ただし、Pythonをコンパイルするため、ページを開いた時にタイムラグが発生します。 これが、先程、JavaScriptとPyScriptを比較し、PyScriptのパイチャートが数秒遅れて描画された理由だと思われます。
開発者ツールで見ると、pyodideのダウンロードは、ページを開いてから0.4sあたりで行われており、その後、micropip (Pyodide内のpip簡易実装で、依存モジュールのインストールを実行)などの処理が2.45s辺りで行われていることが分かります。 この、0.4s ~ 2.45sの期間に、Pythonのコードのコンパイルが実行されていたのではないかと思われます。
PyScript自体は何をやっているかというと、
<py-script>
タグなど、Pythonコード実行に必要なHTMLの解析- JavaScriptとの処理のインタラクション機能を提供
- ボタンなどのウィジェット作成モジュールの提供
- ネームスペースの管理 (詳細は調査不足で不明…)
などです。
Jupyter notebookとは違うの?
流石にこれを言う人は少ないと思いますが、念の為触れておきます。
全く違います。
Jupyter notebookは、Pythonのコードを、Pythonの実行環境がある環境で実行するもので、ブラウザで入力したPythonコードがPythonの実行環境に送られて、そこで実行されるものです。 単に、Pythonがインストールされた環境の、ターミナル画面をWebブラウザで表示し、色々と良い感じにしたものです。 利用者は、Pythonでコードを書くエンジニアです。
PyScriptは、Webページを生成するために実行されるフロントエンドのツールです。 そのWebページを見る人には何も嬉しくありません。 そのWebページを作る人が、これまでJavaScriptで書いていたものを、Pythonでも書けるようにした、というものです。
とは言え、将来的には、ブラウザだけでなくPythonのネイティブ環境でも実行できるようにする、と読み取れる文言が、Anacondaのブログには書かれているので、目的は全く異なるものの、Jupyter notebookと若干処理が近いものになる可能性はあるかもしれません。
何がうれしいの?
誰にとってどう嬉しいかは、恐らく以下の通りではないでしょうか。
1. Webで分析を共有したいデータサイエンティストが、JavaScriptで苦しまなくて済む
データ分析の結果を、Jupyter notebook (Jupyter Hub)で共有してもよいのですが、共有される側にJupyter notebookの環境が必要であることや、もう少しREPLで少し共有される側でも見方を変えたい、リッチな描画でデータを見せたい、などある場合は、Webページ化して共有したいかもしれません。
ですが、従来は、そのために、普段Pythonを使うデータサイエンティストが、Webページ作りのためにわざわざJavaScriptを触ることになり、ラーニングコストが大きく面倒だったかと思います。
PyScriptを使えば、出来るだけPythonにコードを寄せることができるので、負担が減るかと思います。
ただ、とは言え、Webページ作りには、従来のJavaScriptの豊富なサードパーティリソースも使う必要があると思われるので、JavaScriptから完全に逃れることは、まだ不可能かと思います。 PyScriptベースのWebでの可視化モジュールなどが今後拡充したら、様相は変わるかもしれません。期待しましょう。
2. Pythonistaが多い組織で、フロントでもPythonのスキルを共有できる(かも。遠い将来は)
私のチームでも、WebシステムのバックエンドにPythonを使っていますが、フロントエンドは当然JavaScript(TypeScript)です。 これだけが理由ではありませんが、バックエンドとフロントエンドは、スキルセットが大きく異なります。
もしPythonでフロントエンドのフレームワークなどが将来的に出来てきたら、様相は大きく変わるかもしれません。 流石に夢物語かもしれませんが。
類似プロジェクト
実は、ブラウザでPythonを動かそうという試みは、これが初ではなく、PyPy.jsというプロジェクトがあります。
開発はスリープ状態ですが、これは、WebAssemblyではなく、asm.jsにコンパイルするものです。
目的は同じなので、PyPy.jsがあるのにPyScriptがなぜ必要なのかは、asm.jsがあるのになぜWebAssemblyが必要なのか、という話とつながるかもしれません。
詳細は理解できてませんが、asm.jsとWebAssemblyの両方を開発したエンジニアのインタビューによると、パージング(ブラウザが構文を解析して実行可能な形に変える工程)にかかる時間がとても大きいこと、JavaScriptの処理系では実現できない処理を可能にすること(例えばメモリ管理辺り)、パフォーマンスを上げること、などがあったようです。下の記事参照です。
おわりに
JavaScriptとPythonとの、メモリやスレッドなど、低レイヤの部分がどう実行されているのか、など、細かいところはまだ調査不足です。 まだ出たばかりなので、PyScript自体もその辺りも含めて、改良が進み、情報公開も増えてくるのではないかと予想しています。
また、エディタも、PyScript用のプラグインはまだないと思いますので、そういった開発に必要な周辺ツールも今後期待されるでしょう。
PyScriptが、将来から振り返った時に、どれほど重要なターニングポイントと言えるかは、全く未知数ですが、ここ最近のPython界隈でのビッグニュースの一つではあろうかと思います。