Usage
Contents
Usage#
This describes the overall workflow to setup an emscripten-32
environment with micromamba
, packing this environment with empack
and use this environment with pyjs
.
Install micromamba#
We strongly recommend to use micromamba when using pyjs
.
Please refer to the mamba and micromamba installation guide in the documentation.
Create the working environment#
First we create an environment containing all the dev-dependencies.
name: pyjs-dev-env
channels:
- conda-forge
dependencies:
- python
- curl
- empack >= 1.2.0
- emsdk >=3.1.11
Assuming the yaml file above is named pyjs-dev-env.yaml
, we can create the dev-environment with:
micromamba create \
--yes --file pyjs-dev-env.yaml \
-c https://repo.mamba.pm/emscripten-forge \
-c https://repo.mamba.pm/conda-forge
Create the web environment#
This is the environment which will be available from the browser / nodejs.
name: pyjs-wasm-env
channels:
- https://repo.mamba.pm/emscripten-forge
- conda-forge
dependencies:
- pyjs == 0.11.1
- numpy
- pyb2d
Assuming the yaml file above is named pyjs-wasm-env.yaml
, we can create the web-environment with:
micromamba create \
--platform=emscripten-32 \
--yes --file pyjs-wasm-env.yaml \
-c https://repo.mamba.pm/emscripten-forge \
-c https://repo.mamba.pm/conda-forge
Pack the environment#
First we download the empack default configuration github
curl https://raw.githubusercontent.com/emscripten-forge/recipes/main/empack_config.yaml --output empack_config.yaml
Next we invoke empack to pack the conda-environment pyjs-wasm-env
into *.data/*.js
files which can be fetched and imported from JavaScript.
empack pack env \
--env-prefix $MAMBA_ROOT_PREFIX/envs/pyjs-wasm-env \
--outname my_sample_application \
--config empack_config.yaml \
--config extra_config.yaml \
--outdir output \
--export-name globalThis.pyjs \
--split
Use It#
Now that we packed our environment in (multiple) JavaScript files, we can start using pyjs
:
Initialize pyjs#
The initialization of pyjs in JavaScript unfortunately still a bit complicated:
// pyjs itself
import {createModule} from '../pyjs_runtime_browser.js';
let pyjs = await createModule()
globalThis.pyjs = pyjs
// content of the packaged wasm environment
const { default: load_all } = await import('../my_sample_application.js')
await load_all()
await pyjs.init()
Use Pyjs#
The initialization of pyjs in JavaScript unfortunately still a bit complicated:
// pyjs itself
pysjs.exec(`
import numpy
print(numpy.zeros([10,20]))
`)
Within the python code called from JavaScript, one has access to the pyjs
python module.
This allows access to the JavaScript side from Python:
from pyjs.js import console
console.log("print to browser console")