Skip to content

Commit 49a25a5

Browse files
committed
Experimenal Pyodide in MicroPython
1 parent 327a765 commit 49a25a5

File tree

2 files changed

+64
-13
lines changed

2 files changed

+64
-13
lines changed

test/raw/micropython/index.html

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,22 +4,32 @@
44
<meta charset="UTF-8">
55
<meta name="viewport" content="width=device-width,initial-scale=1.0">
66
<script type="module">
7-
import { serialize } from 'https://esm.run/@ungap/serialization-registry';
8-
import '../converter.js';
9-
10-
globalThis.test = arg => {
11-
console.log(...serialize(arg));
12-
};
13-
14-
const base = 'https://cdn.jsdelivr.net/npm/@micropython/micropython-webassembly-pyscript@latest';
15-
const { loadMicroPython } = await import(`${base}/micropython.mjs`);
16-
const interpreter = await loadMicroPython({ url: `${base}/micropython.wasm` });
177
const { textContent } = document.querySelector('script[type=micropython]');
18-
interpreter.runPythonAsync(textContent);
8+
const worker = new Worker('./worker.js', { type: 'module' });
9+
worker.postMessage(textContent);
10+
let i = 0;
11+
(function idle() {
12+
requestAnimationFrame(idle);
13+
document.body.textContent = i++;
14+
}());
1915
</script>
2016
<script type="micropython" async>
21-
import js
22-
js.test([{'a': 123}, {'a': 456}])
17+
import pyodide
18+
19+
print("importing pyodide.sys")
20+
21+
sys = await pyodide.sys
22+
print(sys.version)
23+
24+
print("---")
25+
26+
sys = await pyodide.sys
27+
print(sys.version)
28+
29+
print("---")
30+
31+
pandas = await pyodide.pandas
32+
print(pandas.__version__)
2333
</script>
2434
</head>
2535
</html>

test/raw/micropython/worker.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
const { promise, resolve } = Promise.withResolvers();
2+
3+
addEventListener('message', async ({ data }) => {
4+
await promise;
5+
await interpreter.runPythonAsync(data);
6+
});
7+
8+
// Instant MicroPython
9+
const base = 'https://cdn.jsdelivr.net/npm/@micropython/micropython-webassembly-pyscript@latest';
10+
const { loadMicroPython } = await import(`${base}/micropython.mjs`);
11+
const interpreter = await loadMicroPython({ url: `${base}/micropython.wasm` });
12+
13+
// Lazy Pyodide
14+
let pyodide;
15+
interpreter.registerJsModule('pyodide', new Proxy(new Map, {
16+
async get(locals, prop) {
17+
const [ module ] = prop.split(/[@<>=]/);
18+
if (!locals.has(module)) {
19+
if (!pyodide) {
20+
const { loadPyodide } = await import(`https://cdn.jsdelivr.net/pyodide/v0.28.1/full/pyodide.mjs`);
21+
pyodide = await loadPyodide({ indexURL: 'https://cdn.jsdelivr.net/pyodide/v0.28.1/full' });
22+
}
23+
try {
24+
pyodide.runPython(`import ${module}`, { locals });
25+
}
26+
catch {
27+
let micropip = locals.get('micropip');
28+
if (!micropip) {
29+
await pyodide.loadPackage('micropip');
30+
micropip = pyodide.pyimport('micropip');
31+
locals.set('micropip', micropip);
32+
}
33+
await micropip.install([prop], { keep_going: true });
34+
pyodide.runPython(`import ${module}`, { locals });
35+
}
36+
}
37+
return locals.get(module);
38+
}
39+
}));
40+
41+
resolve();

0 commit comments

Comments
 (0)