ソースコード: GitHub - iodide-project/pyodide: The Python scientific stack, compiled to WebAssembly
Pyodide (パイオダイド) とは Mozilla が開発中の Web ブラウザーの WebAssembly で動作する Python の実装である。
Web ブラウザ上で Python 言語および Python のデータサイエンスライブラリ (NumPy, Scipy, Pandas, Matplotlib… などpyodide/packages を参照) をそのまま使ってプログラミングできるような環境を目指している。
Pyodide は Emscripten (C/C++ から WebAssembly を生成するコンパイラ) を利用した cpython-emscripten を元に開発されている。
PyScript is an open source platform for Python in the browser.
sparckles/starfyre: A reactive, WASM based SSR Python Web Framework for Front-End Applications
Python Interpreter Loading...
>>> import sys >>> sys.version '3.10.2 (main, Sep 25 2022, 05:41:13) [Clang 16.0.0 (https://github.com/llvm/llvm-project a4a29438f451370ed241dde30bfc' >>> sys.version_info sys.version_info(major=3, minor=10, micro=2, releaselevel='final', serial=0) >>> import platform >>> platform.system() 'Emscripten' >>> platform.platform() 'Emscripten-3.1.21-wasm32-32bit' >>>
Releases · iodide-project/pyodide · GitHub より pyodide-0.22.0a1.tar.bz2 をダウンロードして Web サーバーに配置する。
$ curl -LO https://github.com/pyodide/pyodide/releases/download/0.22.0a1/pyodide-0.22.0a1.tar.bz2
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0 100 182M 100 182M 0 0 3010k 0 0:01:02 0:01:02 --:--:-- 2627k
$ mkdir -p ~/dokuwiki/data/media/python/pyodide/ $ tar jxvf pyodide-0.22.0a1.tar.bz2 -C ~/dokuwiki/data/media/python/pyodide/
pyodide/ pyodide/fpcast_test-0.1.1-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/atomicwrites-1.4.0-py2.py3-none-any.whl pyodide/Jinja2-3.1.2-py3-none-any.whl pyodide/pytest-7.1.2-py3-none-any.whl pyodide/six-1.16.0-py2.py3-none-any.whl pyodide/pyodide_tblib-1.7.1-py3-none-any.whl pyodide/MarkupSafe-2.1.1-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/pluggy-1.0.0-py2.py3-none-any.whl pyodide/pytz-2022.1-py2.py3-none-any.whl pyodide/pyparsing-3.0.9-py3-none-any.whl pyodide/attrs-21.4.0-py2.py3-none-any.whl pyodide/micropip-0.1.0-py3-none-any.whl pyodide/iniconfig-1.1.1-py2.py3-none-any.whl pyodide/sharedlib_test_py-1.0-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/repodata.json pyodide/pyodide_py.tar pyodide/test.html pyodide/module_test.html pyodide/webworker.js pyodide/webworker_dev.js pyodide/module_webworker_dev.js pyodide/CLAPACK-3.2.1.zip pyodide/suitesparse-5.11.0.zip pyodide/libmagic-5.42.zip pyodide/numpy-1.22.4-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/pkgconfig-1.5.5-py3-none-any.whl pyodide/kiwisolver-1.4.3-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/python_dateutil-2.8.2-py2.py3-none-any.whl pyodide/html5lib-1.1-py2.py3-none-any.whl pyodide/future-0.18.2-py3-none-any.whl pyodide/future-tests.tar pyodide/joblib-tests.tar pyodide/swiglpk-5.0.2-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/cffi_example-0.1-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/python_solvespace-3.0.7-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/sqlalchemy-tests.tar pyodide/cytoolz-tests.tar pyodide/decorator-5.1.1-py3-none-any.whl pyodide/jedi-tests.tar pyodide/pyodide.mjs.map pyodide/pyodide.mjs pyodide/tsconfig.tsbuildinfo pyodide/pyodide.js.map pyodide/pyodide.js pyodide/pyodide.asm.data pyodide/pyodide.asm.wasm pyodide/pyodide.asm.js pyodide/pyodide.d.ts pyodide/package.json pyodide/console.html pyodide/openssl-1.1.1n.zip pyodide/ssl-1.0.0.zip pyodide/cpp-exceptions-test-0.1.zip pyodide/sharedlib-test-1.0.zip pyodide/sqlite3-1.0.0.zip pyodide/test-1.0.0.zip pyodide/distutils-1.0.0.zip pyodide/lzma-1.0.0.zip pyodide/setuptools-62.6.0-py3-none-any.whl pyodide/regex-2022.6.2-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/regex-tests.tar pyodide/py-1.11.0-py2.py3-none-any.whl pyodide/more_itertools-8.13.0-py3-none-any.whl pyodide/packaging-21.3-py3-none-any.whl pyodide/geos-3.10.3.zip pyodide/libhdf5-1.12.1.zip pyodide/numpy-tests.tar pyodide/lxml-4.9.0-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/nose-1.3.7-py3-none-any.whl pyodide/tqdm-4.64.0-py2.py3-none-any.whl pyodide/tomli_w-1.0.0-py3-none-any.whl pyodide/joblib-1.1.0-py2.py3-none-any.whl pyodide/docutils-0.18.1-py2.py3-none-any.whl pyodide/ruamel.yaml-0.17.21-py3-none-any.whl pyodide/SQLAlchemy-1.4.37-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/cytoolz-0.11.2-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/pyproj-3.3.1-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/cycler-0.11.0-py3-none-any.whl pyodide/Brotli-1.0.9-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/uncertainties-3.1.7-py2.py3-none-any.whl pyodide/uncertainties-tests.tar pyodide/svgwrite-1.4.2-py3-none-any.whl pyodide/gmpy2-2.1.2-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/freesasa-2.1.0-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/pytest_benchmark-3.4.1-py2.py3-none-any.whl pyodide/python_sat-0.1.7.dev19-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/jedi-0.18.1-py2.py3-none-any.whl pyodide/cffi-1.15.0-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/coverage-6.4.4-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/soupsieve-2.3.2.post1-py3-none-any.whl pyodide/cssselect-1.1.0-py2.py3-none-any.whl pyodide/pyrsistent-0.18.1-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/asciitree-0.3.3-py3-none-any.whl pyodide/xlrd-2.0.1-py2.py3-none-any.whl pyodide/sympy-1.10.1-py3-none-any.whl pyodide/Logbook-1.5.3-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/newick-1.3.2-py2.py3-none-any.whl pyodide/nltk-3.7-py3-none-any.whl pyodide/nltk-tests.tar pyodide/pydantic-1.9.1-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/wrapt-1.14.1-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/python_magic-0.4.27-py2.py3-none-any.whl pyodide/demes-0.2.2-py3-none-any.whl pyodide/cryptography-38.0.1-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/parso-0.8.3-py2.py3-none-any.whl pyodide/bcrypt-4.0.0-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/retrying-1.3.3-py3-none-any.whl pyodide/bleach-5.0.0-py3-none-any.whl pyodide/cloudpickle-2.1.0-py3-none-any.whl pyodide/jsonschema-4.6.0-py3-none-any.whl pyodide/jsonschema-tests.tar pyodide/pyclipper-1.3.0.post3-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/pycparser-2.21-py2.py3-none-any.whl pyodide/beautifulsoup4-4.11.1-py3-none-any.whl pyodide/beautifulsoup4-tests.tar pyodide/PyYAML-6.0-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/toolz-0.11.2-py3-none-any.whl pyodide/toolz-tests.tar pyodide/matplotlib_pyodide-0.1.1-py3-none-any.whl pyodide/msgpack-1.0.4-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/certifi-2022.6.15-py3-none-any.whl pyodide/fonttools-4.33.3-py3-none-any.whl pyodide/Pygments-2.12.0-py3-none-any.whl pyodide/typing_extensions-4.2.0-py3-none-any.whl pyodide/threadpoolctl-3.1.0-py3-none-any.whl pyodide/lazy_object_proxy-1.7.1-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/webencodings-0.5.1-py2.py3-none-any.whl pyodide/mpmath-1.2.1-py3-none-any.whl pyodide/mpmath-tests.tar pyodide/distlib-0.3.4-py2.py3-none-any.whl pyodide/fonts/ pyodide/fonts/DejaVuSans-Bold.ttf pyodide/fonts/DejaVuSans-BoldOblique.ttf pyodide/fonts/DejaVuSans-Oblique.ttf pyodide/fonts/DejaVuSans.ttf pyodide/fonts/DejaVuSansDisplay.ttf pyodide/fonts/DejaVuSansMono-Bold.ttf pyodide/fonts/DejaVuSansMono-BoldOblique.ttf pyodide/fonts/DejaVuSansMono-Oblique.ttf pyodide/fonts/DejaVuSansMono.ttf pyodide/fonts/DejaVuSerif-Bold.ttf pyodide/fonts/DejaVuSerif-BoldItalic.ttf pyodide/fonts/DejaVuSerif-Italic.ttf pyodide/fonts/DejaVuSerif.ttf pyodide/fonts/DejaVuSerifDisplay.ttf pyodide/fonts/Humor-Sans.ttf pyodide/fonts/LICENSE_DEJAVU pyodide/fonts/LICENSE_STIX pyodide/fonts/STIXGeneral.ttf pyodide/fonts/STIXGeneralBol.ttf pyodide/fonts/STIXGeneralBolIta.ttf pyodide/fonts/STIXGeneralItalic.ttf pyodide/fonts/STIXNonUni.ttf pyodide/fonts/STIXNonUniBol.ttf pyodide/fonts/STIXNonUniBolIta.ttf pyodide/fonts/STIXNonUniIta.ttf pyodide/fonts/STIXSizFiveSymReg.ttf pyodide/fonts/STIXSizFourSymBol.ttf pyodide/fonts/STIXSizFourSymReg.ttf pyodide/fonts/STIXSizOneSymBol.ttf pyodide/fonts/STIXSizOneSymReg.ttf pyodide/fonts/STIXSizThreeSymBol.ttf pyodide/fonts/STIXSizThreeSymReg.ttf pyodide/fonts/STIXSizTwoSymBol.ttf pyodide/fonts/STIXSizTwoSymReg.ttf pyodide/fonts/cmb10.ttf pyodide/fonts/cmex10.ttf pyodide/fonts/cmmi10.ttf pyodide/fonts/cmr10.ttf pyodide/fonts/cmss10.ttf pyodide/fonts/cmsy10.ttf pyodide/fonts/cmtt10.ttf pyodide/galpy-1.8.0-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/numcodecs-tests.tar pyodide/biopython-1.79-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/rebound-3.19.8-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/cftime-1.6.0-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/scipy-tests.tar pyodide/unyt-2.8.0-py2.py3-none-any.whl pyodide/zarr-2.11.3-py3-none-any.whl pyodide/imageio-2.19.3-py3-none-any.whl pyodide/scikit-learn-tests.tar pyodide/statsmodels-tests.tar pyodide/PIL-9.1.1-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/pycryptodome-3.15.0-cp35-abi3-emscripten_3_1_21_wasm32.whl pyodide/pycryptodome-tests.tar pyodide/traits-6.3.2-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/traits-tests.tar pyodide/termcolor-1.1.0-py3-none-any.whl pyodide/bitarray-2.5.1-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/bitarray-tests.tar pyodide/tomli-2.0.1-py3-none-any.whl pyodide/optlang-1.5.2-py2.py3-none-any.whl pyodide/optlang-tests.tar pyodide/sympy-tests.tar pyodide/numcodecs-0.9.1-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/yt-4.0.4-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/bokeh-2.4.3-py3-none-any.whl pyodide/networkx-2.8.4-py3-none-any.whl pyodide/networkx-tests.tar pyodide/scipy-1.9.1-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/colorspacious-1.1.2-py2.py3-none-any.whl pyodide/unyt-tests.tar pyodide/zarr-tests.tar pyodide/scikit_learn-1.1.1-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/scikit-image-tests.tar pyodide/scikit_image-0.19.3-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/statsmodels-0.13.2-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/xgboost-1.6.1-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/cmyt-1.0.4-py3-none-any.whl pyodide/cmyt-tests.tar pyodide/matplotlib-3.5.2-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/matplotlib-tests.tar pyodide/Shapely-1.8.2-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/shapely-tests.tar pyodide/pandas-1.5.0-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/pandas-tests.tar pyodide/mne-1.0.3-py3-none-any.whl pyodide/mne-tests.tar pyodide/boost_histogram-1.3.1-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/RobotRaconteur-0.15.1-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/msprime-1.2.0-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/h5py-3.7.0-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/h5py-tests.tar pyodide/PyWavelets-1.3.0-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/pywavelets-tests.tar pyodide/autograd-1.4-py3-none-any.whl pyodide/autograd-tests.tar pyodide/xarray-2022.3.0-py3-none-any.whl pyodide/xarray-tests.tar pyodide/astropy-5.1-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/pyerfa-2.0.0.1-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/pyerfa-tests.tar pyodide/patsy-0.5.2-py2.py3-none-any.whl pyodide/patsy-tests.tar pyodide/tskit-0.4.1-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/nlopt-2.7.0-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/sparseqr-1.2-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/reboundx-3.7.1-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/gsw-3.4.0-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/gsw-tests.tar pyodide/b2d-0.7.2-cp310-cp310-emscripten_3_1_21_wasm32.whl pyodide/opencv_python-4.6.0.66-cp310-cp310-emscripten_3_1_21_wasm32.whl
$ mv ~/dokuwiki/data/media/python/pyodide/pyodide/ ~/dokuwiki/data/media/python/pyodide/0.22.0a1
console.html を実行するには修正が必要である。
pyodide_dev.js をロードする前に self.languagePluginUrl の設定が必要である。(これを設定しないと内部のロード処理が全てのファイルが Web サーバーのルートに置かれていると仮定して動作する)
<!doctype html> <html> <head> ... <script> self.languagePluginUrl = './'; </script> <script src="./pyodide_dev.js"></script> </head> ...
更に Microsoft Edge で実行可能にするには、以下の修正が必要である。
48~52 行目
try { dirs = FS.readdir(rootpath); } catch (err) { return; }
} catch { を } catch (err) { に修正。
87~92 行目
try { self.importScripts(url); onload(); } catch (err) { onerror(); }
} catch { を } catch (err) { に修正。