| 254 | * Install a Python package |
| 255 | */ |
| 256 | export async function installPackage(packageName: string): Promise<void> { |
| 257 | if (!pyodideInstance) { |
| 258 | throw new Error("Pyodide not initialized"); |
| 259 | } |
| 260 | |
| 261 | console.log(`[Python] Installing package: ${packageName}`); |
| 262 | |
| 263 | try { |
| 264 | // Try micropip first |
| 265 | await pyodideInstance.runPython(` |
| 266 | import micropip |
| 267 | await micropip.install('${packageName}') |
| 268 | `); |
| 269 | } catch (error) { |
| 270 | // Fallback to loadPackage for packages in the main distribution |
| 271 | try { |
| 272 | await pyodideInstance.loadPackage([packageName]); |
| 273 | } catch (fallbackError) { |
| 274 | console.error(`[Python] Failed to install ${packageName}:`, fallbackError); |
| 275 | throw new Error(`Failed to install ${packageName}: ${fallbackError}`); |
| 276 | } |
| 277 | } |
| 278 | |
| 279 | console.log(`[Python] Successfully installed: ${packageName}`); |
| 280 | } |
| 281 | |
| 282 | /** |
| 283 | * Get list of installed packages |