Loading packages#

Only the Python standard library is available after importing Pyodide. To use other packages, you’ll need to load them using either:

Note

micropip can also be used to load packages built in Pyodide (in which case it relies on pyodide.loadPackage).

If you use pyodide.loadPackagesFromImports Pyodide will automatically download all packages that the code snippet imports. This is particularly useful for making a repl since users might import unexpected packages. At present, loadPackagesFromImports will not download packages from PyPI, it will only download packages included in the Pyodide distribution. See Packages built in Pyodide to check the full list of packages included in Pyodide.

Loading packages with pyodide.loadPackage#

Packages included in the official Pyodide repository can be loaded using pyodide.loadPackage:

await pyodide.loadPackage("numpy");

It is also possible to load packages from custom URLs:

await pyodide.loadPackage(
  "https://foo/bar/numpy-1.22.3-cp310-cp310-emscripten_3_1_13_wasm32.whl"
);

The file name must be a valid wheel name.

When you request a package from the official repository, all of the package’s dependencies are also loaded. Dependency resolution is not yet implemented when loading packages from custom URLs.

In general, loading a package twice is not permitted. However, one can override a dependency by loading a custom URL with the same package name before loading the dependent package.

Multiple packages can also be loaded at the same time by passing a list to pyodide.loadPackage.

await pyodide.loadPackage(["cycler", "pytz"]);

pyodide.loadPackage returns a Promise which resolves when all the packages are finished loading:

let pyodide;
async function main() {
  pyodide = await loadPyodide();
  await pyodide.loadPackage("matplotlib");
  // matplotlib is now available
}
main();

Micropip#

Installing packages from PyPI#

Pyodide supports installing pure Python wheels from PyPI with micropip. micropip.install() returns a Python Future so you can await the future or otherwise use the Python future API to do work once the packages have finished loading:

await pyodide.loadPackage("micropip");
const micropip = pyodide.pyimport("micropip");
await micropip.install('snowballstemmer');
pyodide.runPython(`
  import snowballstemmer
  stemmer = snowballstemmer.stemmer('english')
  print(stemmer.stemWords('go goes going gone'.split()))
`);

Micropip implements file integrity validation by checking the hash of the downloaded wheel against pre-recorded hash digests from the PyPI JSON API.

Installing wheels from arbitrary URLs#

Pure Python wheels can also be installed from any URL with micropip,

import micropip
micropip.install(
    'https://example.com/files/snowballstemmer-2.0.0-py2.py3-none-any.whl'
)

Micropip decides whether a file is a URL based on whether it ends in “.whl” or not. The wheel name in the URL must follow PEP 427 naming convention, which will be the case if the wheels is made using standard Python tools (pip wheel, setup.py bdist_wheel). Micropip will also install the dependencies of the wheel. If dependency resolution is not desired, you may pass deps=False.

Cross-Origin Resource Sharing (CORS)

If the file is on a remote server, the server must set Cross-Origin Resource Sharing (CORS) headers to allow access. If the server doesn’t set CORS headers, you can use a CORS proxy. Note that using third-party CORS proxies has security implications, particularly since we are not able to check the file integrity, unlike with installs from PyPI. See this stack overflow answer for more information about CORS.

Example#

<html>
  <head>
    <meta charset="utf-8" />
  </head>
  <body>
    <script
      type="text/javascript"
      src="https://cdn.jsdelivr.net/pyodide/dev/full//pyodide.js"
    ></script>
    <script type="text/javascript">
      async function main() {
        let pyodide = await loadPyodide();
        await pyodide.loadPackage("micropip");
        const micropip = pyodide.pyimport("micropip");
        await micropip.install("snowballstemmer");
        await pyodide.runPython(`
        import snowballstemmer
        stemmer = snowballstemmer.stemmer('english')
        print(stemmer.stemWords('go goes going gone'.split()))
      `);
      }
      main();
    </script>
  </body>
</html>