Skip to content

Commit 33c2688

Browse files
committed
Added lazy_py_modules
1 parent a47febd commit 33c2688

File tree

7 files changed

+53
-17
lines changed

7 files changed

+53
-17
lines changed

docs/index.js

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/index.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

esm/interpreter/_python.js

+8
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
11
import { dedent } from '../utils.js';
22
import { io } from './_io.js';
33

4+
export const loader = new WeakMap();
5+
46
// REQUIRES INTEGRATION TEST
57
/* c8 ignore start */
68
export const registerJSModule = (interpreter, name, value) => {
9+
if (name === 'polyscript') {
10+
value.lazy_py_modules = async (...packages) => {
11+
await loader.get(interpreter)(packages);
12+
return packages.map(name => interpreter.pyimport(name));
13+
};
14+
}
715
interpreter.registerJsModule(name, value);
816
};
917

esm/interpreter/micropython.js

+10-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// import fetch from '@webreflection/fetch';
22
import { fetchFiles, fetchJSModules, fetchPaths, writeFile } from './_utils.js';
3-
import { getFormat, registerJSModule, run, runAsync, runEvent } from './_python.js';
3+
import { getFormat, loader, registerJSModule, run, runAsync, runEvent } from './_python.js';
44
import { stdio, buffered } from './_io.js';
55
import mip from '../python/mip.js';
66
import zip from '../zip.js';
@@ -20,17 +20,15 @@ export default {
2020
});
2121
url = url.replace(/\.m?js$/, '.wasm');
2222
const interpreter = await get(loadMicroPython({ linebuffer: false, stderr, stdout, url }));
23+
const py_imports = importPackages.bind(interpreter);
24+
loader.set(interpreter, py_imports);
2325
if (config.files) await fetchFiles(this, interpreter, config.files);
2426
if (config.fetch) await fetchPaths(this, interpreter, config.fetch);
2527
if (config.js_modules) await fetchJSModules(config.js_modules);
2628

2729
// Install Micropython Package
2830
this.writeFile(interpreter, './mip.py', mip);
29-
if (config.packages){
30-
const mpyPackageManager = interpreter.pyimport('mip');
31-
for (const mpyPackage of config.packages)
32-
mpyPackageManager.install(mpyPackage);
33-
}
31+
if (config.packages) await py_imports(config.packages);
3432
return interpreter;
3533
},
3634
registerJSModule,
@@ -92,4 +90,10 @@ export default {
9290
return writeFile(fs, path, buffer);
9391
},
9492
};
93+
94+
async function importPackages(packages) {
95+
const mpyPackageManager = this.pyimport('mip');
96+
for (const mpyPackage of packages)
97+
mpyPackageManager.install(mpyPackage);
98+
}
9599
/* c8 ignore stop */

esm/interpreter/pyodide.js

+12-7
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { create } from 'gc-hook';
22

33
import { RUNNING_IN_WORKER, fetchFiles, fetchJSModules, fetchPaths, writeFile } from './_utils.js';
4-
import { getFormat, registerJSModule, run, runAsync, runEvent } from './_python.js';
4+
import { getFormat, loader, registerJSModule, run, runAsync, runEvent } from './_python.js';
55
import { stdio } from './_io.js';
66

77
const type = 'pyodide';
@@ -89,15 +89,12 @@ export default {
8989
const interpreter = await get(
9090
loadPyodide({ stderr, stdout, indexURL }),
9191
);
92+
const py_imports = importPackages.bind(interpreter);
93+
loader.set(interpreter, py_imports);
9294
if (config.files) await fetchFiles(this, interpreter, config.files);
9395
if (config.fetch) await fetchPaths(this, interpreter, config.fetch);
9496
if (config.js_modules) await fetchJSModules(config.js_modules);
95-
if (config.packages) {
96-
await interpreter.loadPackage('micropip');
97-
const micropip = await interpreter.pyimport('micropip');
98-
await micropip.install(config.packages, { keep_going: true });
99-
micropip.destroy();
100-
}
97+
if (config.packages) await py_imports(config.packages);
10198
return interpreter;
10299
},
103100
registerJSModule,
@@ -120,4 +117,12 @@ export default {
120117
return writeFile({ FS, PATH, PATH_FS }, path, buffer);
121118
},
122119
};
120+
121+
// exposed utility to import packages via polyscript.lazy_py_modules
122+
async function importPackages(packages) {
123+
await this.loadPackage('micropip');
124+
const micropip = this.pyimport('micropip');
125+
await micropip.install(packages, { keep_going: true });
126+
micropip.destroy();
127+
}
123128
/* c8 ignore stop */

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,6 @@
9090
"to-json-callback": "^0.1.1"
9191
},
9292
"worker": {
93-
"blob": "sha256-NuQY85dugu2Ks8ubOmDiR+aw7eOW0CQvTfRQIknWkPk="
93+
"blob": "sha256-8x1Yej68/ZpJysyfYgjrdqQ+hQmhGh7Pol8qLUUi/g4="
9494
}
9595
}

test/py_modules.html

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<meta name="viewport" content="width=device-width,initial-scale=1.0">
6+
<title>python modules</title>
7+
<link rel="stylesheet" href="style.css">
8+
<script type="module" src="../dist/index.js"></script>
9+
</head>
10+
<body>
11+
<script type="pyodide" async>
12+
from polyscript import lazy_py_modules
13+
14+
matplotlib, regex, = await lazy_py_modules("matplotlib", "regex")
15+
16+
print(matplotlib, regex)
17+
</script>
18+
</body>
19+
</html>

0 commit comments

Comments
 (0)