yu nkt’s blog

nkty blog

I'm an enterprise software and system architecture. This site dedicates sharing knowledge and know-how about system architecture with me and readers.

ブラウザで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が主導していると思います。

pyscript.net

ブラウザで実行できるプログラムと言えばJavaScriptですが、そのJavaScriptと同じようにブラウザで実行することが出来ます。

例えば、このような感じです(こちらの記事の著者のGistです)。

gist.github.com

上の例では、PyScriptのコードは、CDNからダウンロードしているので、ローカルで何かインストールする必要はありません。 一応、PyScriptのコードはZipでも提供されているので、それをダウンロードし、解凍して、PyScriptのコードパスをHTML内で参照すれば利用できます(が、ドキュメントに書かれているpyscript.csspyscript.jsが見つからない…のでCDN利用するのが無難です)。

HTMLに、<py-script>と書いて、Pythonのコードを入れ込めています。

FirefoxChromeで実行してみた所、Hello Worldのみで概ね数秒かかりました。

youtu.be

これだけでは面白くないので、PyScriptのZipの中に入っているexampleから、d3jsでパイチャートを描画するページも表示してみましょう。

youtu.be

左が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というプロジェクトがあります。

github.com

開発はスリープ状態ですが、これは、WebAssemblyではなく、asm.jsにコンパイルするものです。

目的は同じなので、PyPy.jsがあるのにPyScriptがなぜ必要なのかは、asm.jsがあるのになぜWebAssemblyが必要なのか、という話とつながるかもしれません。

詳細は理解できてませんが、asm.jsとWebAssemblyの両方を開発したエンジニアのインタビューによると、パージング(ブラウザが構文を解析して実行可能な形に変える工程)にかかる時間がとても大きいこと、JavaScriptの処理系では実現できない処理を可能にすること(例えばメモリ管理辺り)、パフォーマンスを上げること、などがあったようです。下の記事参照です。

codezine.jp

おわりに

JavaScriptPythonとの、メモリやスレッドなど、低レイヤの部分がどう実行されているのか、など、細かいところはまだ調査不足です。 まだ出たばかりなので、PyScript自体もその辺りも含めて、改良が進み、情報公開も増えてくるのではないかと予想しています。

また、エディタも、PyScript用のプラグインはまだないと思いますので、そういった開発に必要な周辺ツールも今後期待されるでしょう。

PyScriptが、将来から振り返った時に、どれほど重要なターニングポイントと言えるかは、全く未知数ですが、ここ最近のPython界隈でのビッグニュースの一つではあろうかと思います。

参考