12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- // webworker.js
- // Setup your project to serve `py-worker.js`. You should also serve
- // `pyodide.js`, and all its associated `.asm.js`, `.json`,
- // and `.wasm` files as well:
- importScripts('/pyodide/pyodide.js');
- async function loadPyodideAndPackages(packages = []) {
- self.stdout = null;
- self.stderr = null;
- self.result = null;
- self.pyodide = await loadPyodide({
- indexURL: '/pyodide/',
- stdout: (text) => {
- console.log('Python output:', text);
- if (self.stdout) {
- self.stdout += `${text}\n`;
- } else {
- self.stdout = `${text}\n`;
- }
- },
- stderr: (text) => {
- console.log('An error occured:', text);
- if (self.stderr) {
- self.stderr += `${text}\n`;
- } else {
- self.stderr = `${text}\n`;
- }
- }
- });
- await self.pyodide.loadPackage('micropip');
- const micropip = self.pyodide.pyimport('micropip');
- await micropip.set_index_urls('https://pypi.org/pypi/{package_name}/json');
- await micropip.install(packages);
- }
- self.onmessage = async (event) => {
- const { id, code, ...context } = event.data;
- console.log(event.data)
- // The worker copies the context in its own "memory" (an object mapping name to values)
- for (const key of Object.keys(context)) {
- self[key] = context[key];
- }
- // make sure loading is done
- await loadPyodideAndPackages(self.packages);
- self.result = await self.pyodide.runPythonAsync(code);
- self.postMessage({ id, result: self.result, stdout: self.stdout, stderr: self.stderr });
- };
|