nikkie-ftnextの日記

イベントレポートや読書メモを発信

Pyodide素振りの記:micropipでなんとPyPIからインストールできちゃいます!(愛しのemi-reをブラウザで動かせたぜ🤗)

はじめに

ぐへへ nikkieです🤪

PyCon mini Shizuoka 2024 continueで非常に気になったのがPyodide1
ドキュメントに沿って素振りしていきます!

目次

Pyodideの「Getting started」

Complete exampleを写経しました。
index.htmlGitHub PagesでWebに公開しています。
https://ftnext.github.io/pyodide-practice/index.html

開発者ツールからコンソールを見ると(※私はFirefoxを使っています)

PyodideをJavaScriptから使えるようにする読み込み

<script src="https://cdn.jsdelivr.net/pyodide/v0.27.2/full/pyodide.js"></script>

loadPyodide()2して、Pythonコード(文字列)を渡して実行できます(コードは抜粋版です)

async function main() {
  let pyodide = await loadPyodide();
  console.log(pyodide.runPython(`
    import sys
    sys.version
  `));
  pyodide.runPython('print(f"{1+2=}")');
}
main();

ブラウザのコンソールへの出力方法

  • Pythonコードのpyodide.runPython()の返り値3console.log()に渡して出力
  • pyodide.runPython()するPythonコードの中でprint()を呼ぶ

PyPIからパッケージをインストールする

Pythonだけで実装されたパッケージ(Pure Python。C拡張のようなコンパイルしたコードを含まない)は、PyPIからPyodide環境にインストールできるんです!
https://pyodide.org/en/stable/usage/loading-packages.html#installing-packages

自作パッケージemi-re4PyPIからインストールしてPyodideで動かす例5
https://ftnext.github.io/pyodide-practice/install-packages.html

抜粋したコード

async function main() {
  let pyodide = await loadPyodide();

  await pyodide.loadPackage("micropip");
  const micropip = pyodide.pyimport("micropip");

  await micropip.install("emi-re");
  pyodide.runPython(`
    import emire
    print(emire.remove_spaces("Algorithm C ないしは アルゴリズム C"))
  `);
}

main();

micropipでPyodide環境にパッケージをインストールできると知りました!
Basic Usage — micropip 0.9.0 documentation
Pure Python packagesはPyPIからインストールできます

JavaScriptコードでmicropipにアクセスするには

  1. pyodide.loadPackage("micropip")6
  2. pyodide.pyimport("micropip")7

これでmicropip.install("パッケージ名")できるようになります。

emi-reのREADMEにある、日本語テキストから空白を除く例を動かしました。
https://pypi.org/project/emi-re/

終わりに

PyCon mini Shizuoka 2024 continueで触発されてPyodideを触りました。
micropipの使い方は完全に理解したので、PyPIにあるPure Pythonパッケージを使いたい放題です。
「俺には、60万のプロジェクトがある!(ドン!!)」8

2つのHTMLファイルの全体はこちらから確認できます

Webブラウザ(WASM)という新たなPython環境(遊び場)を手に入れたことに興奮収まりません!
次はDOMの操作ですかね


  1. 聞いたことあるくらいだったんですが、静岡の複数のトークで出会ったんですよ!
  2. https://pyodide.org/en/stable/usage/api/js-api.html#globalThis.loadPyodide
  3. CPython処理系と異なり、最後の文が式であれば式の値が返るとのことです。 https://pyodide.org/en/stable/usage/api/js-api.html#pyodide.runPython だからsys.versionの文字列が返っているのですね
  4. 捧ぐッ...!
  5. 画像は、ドキュメントにあるsnowballstemmerの例も含めた実行結果です。
  6. https://pyodide.org/en/stable/usage/api/js-api.html#pyodide.loadPackage
  7. importしたモジュールを返す! https://pyodide.org/en/stable/usage/api/js-api.html#pyodide.pyimport
  8. PyPIのトップで確認できるプロジェクトの数です。マジレスするとPure Pythonなものはもっと減るでしょう