diff --git a/packages/pyodide-kernel-extension/src/index.ts b/packages/pyodide-kernel-extension/src/index.ts index 5d801b8b..5c1f33f4 100644 --- a/packages/pyodide-kernel-extension/src/index.ts +++ b/packages/pyodide-kernel-extension/src/index.ts @@ -58,6 +58,7 @@ const kernel: JupyterLiteServerPlugin = { const pipliteUrls = rawPipUrls.map((pipUrl: string) => URLExt.parse(pipUrl).href); const disablePyPIFallback = !!config.disablePyPIFallback; const loadPyodideOptions = config.loadPyodideOptions || {}; + const extraPackagesAndIndexes = config.extraPackagesAndIndexes || []; for (const [key, value] of Object.entries(loadPyodideOptions)) { if (key.endsWith('URL') && typeof value === 'string') { @@ -99,6 +100,7 @@ const kernel: JupyterLiteServerPlugin = { mountDrive, loadPyodideOptions, contentsManager, + extraPackagesAndIndexes, }); }, }); diff --git a/packages/pyodide-kernel/src/_pypi.ts b/packages/pyodide-kernel/src/_pypi.ts index cc494544..036ae3b8 100644 --- a/packages/pyodide-kernel/src/_pypi.ts +++ b/packages/pyodide-kernel/src/_pypi.ts @@ -1,7 +1,9 @@ // this file is autogenerated from the wheels described in ../package.json export * as allJSONUrl from '../pypi/all.json'; export * as ipykernelWheelUrl from '../pypi/ipykernel-6.9.2-py3-none-any.whl'; -export * as pipliteWheelUrl from '../pypi/piplite-0.6.0a0-py3-none-any.whl'; -export * as pyodide_kernelWheelUrl from '../pypi/pyodide_kernel-0.6.0a0-py3-none-any.whl'; +export * as pipliteWheelUrl from '../pypi/piplite-0.5.2-py3-none-any.whl'; +export * as pipliteWheelUrl1 from '../pypi/piplite-0.6.0a0-py3-none-any.whl'; +export * as pyodide_kernelWheelUrl from '../pypi/pyodide_kernel-0.5.2-py3-none-any.whl'; +export * as pyodide_kernelWheelUrl1 from '../pypi/pyodide_kernel-0.6.0a0-py3-none-any.whl'; export * as widgetsnbextensionWheelUrl from '../pypi/widgetsnbextension-3.6.999-py3-none-any.whl'; export * as widgetsnbextensionWheelUrl1 from '../pypi/widgetsnbextension-4.0.999-py3-none-any.whl'; diff --git a/packages/pyodide-kernel/src/kernel.ts b/packages/pyodide-kernel/src/kernel.ts index 16036257..5aaa0596 100644 --- a/packages/pyodide-kernel/src/kernel.ts +++ b/packages/pyodide-kernel/src/kernel.ts @@ -120,6 +120,7 @@ export class PyodideKernel extends BaseKernel implements IKernel { location: this.location, mountDrive: options.mountDrive, loadPyodideOptions: options.loadPyodideOptions || {}, + extraPackagesAndIndexes: options.extraPackagesAndIndexes || [], }; } @@ -394,5 +395,6 @@ export namespace PyodideKernel { * The Jupyterlite content manager */ contentsManager: Contents.IManager; + extraPackagesAndIndexes: Array<{ packages: string[]; indexes: string[] | null }>; } } diff --git a/packages/pyodide-kernel/src/tokens.ts b/packages/pyodide-kernel/src/tokens.ts index eaaed75f..7e4f8c77 100644 --- a/packages/pyodide-kernel/src/tokens.ts +++ b/packages/pyodide-kernel/src/tokens.ts @@ -90,6 +90,11 @@ export namespace IPyodideWorkerKernel { */ mountDrive: boolean; + /** + * List of extra url/wheel paths to load, and extra associated indexes urls (if not a wheel url) + */ + extraPackagesAndIndexes: Array<{ packages: string[]; indexes: string[] | null }>; + /** * additional options to provide to `loadPyodide` * @see https://pyodide.org/en/stable/usage/api/js-api.html#globalThis.loadPyodide diff --git a/packages/pyodide-kernel/src/worker.ts b/packages/pyodide-kernel/src/worker.ts index 6b6c2208..74c3ccb1 100644 --- a/packages/pyodide-kernel/src/worker.ts +++ b/packages/pyodide-kernel/src/worker.ts @@ -102,6 +102,25 @@ export class PyodideRemoteKernel { scriptLines.push(`await piplite.install('${pkgName}', keep_going=True)`); } } + const { extraPackagesAndIndexes } = this._options as IPyodideWorkerKernel.IOptions; + if (extraPackagesAndIndexes.length > 0) { + // note that here pkg can be a package name or a wheel url + for (const { packages: pkgs, indexes } of extraPackagesAndIndexes) { + let installCmd: string; + if (indexes === null) { + installCmd = `await piplite.install(${JSON.stringify(pkgs)}, keep_going=True)`; + } else { + installCmd = `await piplite.install(${JSON.stringify(pkgs)}, index_urls=${JSON.stringify(indexes)}, keep_going=True)`; + } + console.info('installing via cmd:', installCmd); + try { + await this._pyodide.runPythonAsync(installCmd); + console.info(`Packages installed successfully`); + } catch (e) { + console.error('Error installing packages', e); + } + } + } // import the kernel scriptLines.push('import pyodide_kernel');