PyScript を使ってブラウザでPytohnを実行してみよう
https://gyazo.com/9b786812e81668b2d636ba882016bdff
アウトライン的なメモ
そのうちまとめます。。。まとまるはず。。。
はじめに
2022年/4月/27日~5月3日で開催されたPyCon US 2022 でAnaconda社のCEO、Peter Wang氏からPyScriptが発表されました。
このPyScriptを使えば、将来的にはほとんどすべてのPythonコードをブラウザ上で実行することができるようになります。
現状はまだ実験的プロジェクトで、実装が難しいそうなモジュールなどを含めいくつかの制約事項があり、100%互換性があるというものではありませんが、pandas や NumPy,、SciPy(部分的サポート)などがサポートされています。
この資料は、この PyScript について説明するものです。
PyScript について
PyScript は、HTML のインタフェースを利用して、ブラウザ上でリッチな Python アプリケーションを作成するためのフレームワークです。PyScriptは、Python の持っている一貫したスタイルルールや、豊かな表現力、習得が容易な第一級のプログラミング言語をユーザーに提供することを目的としています。内部的には、次図で示すようなソフトウェアスタックで動作します。
https://gyazo.com/7ccf0856f14671ec2d6eda57b2c7e2a0
Pyodide(パイオダイドと発音)は、PythonのデータサイエンススタックをWebブラウザで動かすことを目指すプロジェクト。CPython 3.8インタープリタをWebAssemblyにコンパイルし、PythonのデータサイエンススタックをWebブラウザで使用できるようにする。Numpy、Pandas、SciPyなどのパッケージも使用できる。任意のPythonパッケージをPython Package Index(PyPi)からインストールできるほか、外部の関数とのインターフェイスも備える。これによりJavaScript、DOMなどのブラウザインターフェイスからPythonエコシステムを活用できることを目指している。
WASM(WebAssembly)は、プログラミング言語やライブラリの名前ではなく、ブラウザでプログラムを高速実行するための、ブラウザ上で動くバイナリコードの新しいフォーマット(仕様) です。oogle, Microsoft, Mozzila, Appleによって仕様が策定され開発が進められています。2015年6月17日に発表され、2017年11月にFirefox、Chrome、Safari、Edge等の主要なブラウザの全てに対応したと発表されています。
Mozillaは4月23日、Webブラウザ内でPythonを動かす「Pyodide」を独立したプロジェクトにしたことを発表しました。合わせて、最新版となるPyodide 0.17も公開していま。
PyScriptについて知っておくべき重要なことは、以下の通りです。
ブラウザで実行されるPython ー ドロップインコンテンツ、外部ファイルのホスティング、サーバー側の設定に依存しないアプリケーションホスティングを可能にする
Pythonエコシステム ー Pythonの多くの一般的なパッケージと科学領域のライブラリ(numpy、pandas、scikit-learnなど)を実行することができる。
PythonとJavaScriptの連携 ー PythonとJavascriptのオブジェクトと名前空間間の双方向通信
環境管理 ー ページコードを実行するためにどのようなパッケージやファイルを含めるかをユーザーが定義できるようにする
ビジュアルアプリケーション開発 ー ボタン、コンテナ、テキストボックスなど、すぐに利用可能なUIコンポーネントを利用可能
柔軟なフレームワーク ー 新しいプラグインや拡張可能なコンポーネントを直接Pythonで作成し、共有するために活用できる柔軟なフレームワーク    (??どうやって)
期待が持てるけれど、現状は起動に時間がかかる。
FizzBuzz問題の場合で、結果が表示されまで20秒かかる。
CDNからダウンロードするpyscript.js 自体は小さく瞬時に終わる(1.1MB)
code: bash
ime curl -sLO https://pyscript.net/alpha/pyscript.js
curl -sLO https://pyscript.net/alpha/pyscript.js 0.03s user 0.04s system 39% cpu 0.182 total
LinuxなどのOS上で実行されるPython環境と異なり、Webブラウザ環境ではファイルシステムなどへはアクセスできないなどの相違点はあります。
実装がかなり難しいもの
ネットワークソケット
マルチプロセッシング
ホストのファイルシステムへのアクセス
近いうちに実装されそうなもの
スレッド
非同期堀(async)
OS環境とWebブラウザ環境の違いを埋めようとしているのが、Mozillaが現在中心となって策定しようとしている標準仕様のWASI(WebAssembly System Interface)
Pythonコードからインストールされているライブラリ/パッケージを取得する方法
code: python
import pkg_resources
for dist in pkg_resources.working_set:
print(dist.project_name, dist.version)
pyscript.write() で特定のDocument Object Model (DOM) のIDに書き出す。
code: python
pyscript.write(arg1, arg2)
code: python
<div id="blue" class="alert alert-primary"></div>
<div id="red" class="alert alert-danger"></div>
<py-script>
pyscript.write('blue', "In blue.")
pyscript.write('red', "In red.")
</py-script>
プロットを書き出すためには、次のように記述する。
code: HTML
<div id="myplot"></div>
<py-script output="myplot">
...
/py-script>
</div>
<py-script src="test.py"> のようにファイル名を指定することもできるが、ローカルホストにHTTPのサーバーをあげている必要がある。file:// のようにHTML単独でオープンした場合はNG
<py-repl> ... </py-repl>` でREPL(対話型インタフェース)が表示される。
PyPI からパッケージをインストールすることができる。
これは、PyScript というよりも Pyodide で行う。
PurePythonのパッケージに限定される。つまり、C拡張がされていると難しい。 SciPy が全ての機能がサポートされていない理由もこれが要因。
micropip を使う
Pyodideは、PyPIから純粋なPythonホイールをmicropipでインストールすることをサポートしています。micropip.install()はPython Futureを返すので、パッケージの読み込みが終わったら、python future APIを使って処理を待つことができます。
code: python
pyodide.runPythonAsync(`
import micropip
await micropip.install('snowballstemmer')
import snowballstemmer
stemmer = snowballstemmer.stemmer('english')
print(stemmer.stemWords('go goes going gone'.split()))
`);
code: python
import micropip
micropip.install(
'https://example.com/files/snowballstemmer-2.0.0-py2.py3-none-any.whl'
)
micropip.list() でインストール済みのライブラリを取得できる。
pyodide.loadPackage()
参考
PyScript
オフィシャルサイト - pyscript.net
デモページ
Pyodide
オフィシャルサイト
ソースコード
Pyodide がサポートしているPythonライブラリ一覧
WebAssembly
オフィシャルサイト webassembly.org
Wikipedia - WebAeembly