Spaces:
Running
Running
const packages = [ | |
'micropip', | |
'packaging', | |
'requests', | |
'beautifulsoup4', | |
'numpy', | |
'pandas', | |
'matplotlib', | |
'scikit-learn', | |
'scipy', | |
'regex', | |
'seaborn' | |
]; | |
import { loadPyodide } from 'pyodide'; | |
import { writeFile, readFile, copyFile, readdir, rmdir } from 'fs/promises'; | |
async function downloadPackages() { | |
console.log('Setting up pyodide + micropip'); | |
let pyodide; | |
try { | |
pyodide = await loadPyodide({ | |
packageCacheDir: 'static/pyodide' | |
}); | |
} catch (err) { | |
console.error('Failed to load Pyodide:', err); | |
return; | |
} | |
const packageJson = JSON.parse(await readFile('package.json')); | |
const pyodideVersion = packageJson.dependencies.pyodide.replace('^', ''); | |
try { | |
const pyodidePackageJson = JSON.parse(await readFile('static/pyodide/package.json')); | |
const pyodidePackageVersion = pyodidePackageJson.version.replace('^', ''); | |
if (pyodideVersion !== pyodidePackageVersion) { | |
console.log('Pyodide version mismatch, removing static/pyodide directory'); | |
await rmdir('static/pyodide', { recursive: true }); | |
} | |
} catch (e) { | |
console.log('Pyodide package not found, proceeding with download.'); | |
} | |
try { | |
console.log('Loading micropip package'); | |
await pyodide.loadPackage('micropip'); | |
const micropip = pyodide.pyimport('micropip'); | |
console.log('Downloading Pyodide packages:', packages); | |
try { | |
for (const pkg of packages) { | |
console.log(`Installing package: ${pkg}`); | |
await micropip.install(pkg); | |
} | |
} catch (err) { | |
console.error('Package installation failed:', err); | |
return; | |
} | |
console.log('Pyodide packages downloaded, freezing into lock file'); | |
try { | |
const lockFile = await micropip.freeze(); | |
await writeFile('static/pyodide/pyodide-lock.json', lockFile); | |
} catch (err) { | |
console.error('Failed to write lock file:', err); | |
} | |
} catch (err) { | |
console.error('Failed to load or install micropip:', err); | |
} | |
} | |
async function copyPyodide() { | |
console.log('Copying Pyodide files into static directory'); | |
// Copy all files from node_modules/pyodide to static/pyodide | |
for await (const entry of await readdir('node_modules/pyodide')) { | |
await copyFile(`node_modules/pyodide/${entry}`, `static/pyodide/${entry}`); | |
} | |
} | |
await downloadPackages(); | |
await copyPyodide(); | |