|
| 1 | +--- |
| 2 | +layout: docs-experimental |
| 3 | +toc_group: python |
| 4 | +link_title: Native Extensions Support |
| 5 | +permalink: /reference-manual/python/Native-Extensions/ |
| 6 | +--- |
| 7 | + |
| 8 | +# Native Extensions Support |
| 9 | + |
| 10 | +Python provides a native extensions API for writing Python extensions in C/C++. GraalPy's support for native extensions |
| 11 | +is currently considered experimental, although many packages like NumPy and PyTorch work well for many use cases. |
| 12 | +Native extensions built for CPython are not binary compatible with GraalPy, therefore it is not possible to use packages |
| 13 | +installed with CPython from GraalPy. Packages have to be installed with GraalPy. Likewise, prebuilt wheels for CPython |
| 14 | +from pypi.org cannot be used with GraalPy. |
| 15 | +The version of *pip* shipped with GraalPy applies additional patches to packages upon installation to make native |
| 16 | +extensions work, it is therefore crucial that you only use the *pip* preinstalled in GraalPy virtualenvs to install |
| 17 | +packages. Don't update *pip* or use alternative tools such as *uv*. GraalPy's *pip* is also preconfigured to use an |
| 18 | +extra repository from graalvm.org where we plan to publish prebuilt wheels for GraalPy for selected commonly used |
| 19 | +packages. |
| 20 | + |
| 21 | +## Embedding limitations |
| 22 | + |
| 23 | +Python native extensions run by default as native binaries, with full access to the underlying system. |
| 24 | +Native code is not sandboxed and can circumvent any protections Truffle or the JVM may provide, up to and including |
| 25 | +aborting the process. |
| 26 | +Native data structures are not subject to the Java GC and the combination of them with Java data structures may lead to |
| 27 | +memory leaks. |
| 28 | +Native libraries generally cannot be loaded multiple times into the same process, and they may contain global state that |
| 29 | +cannot be safely reset. Thus, it's not possible to create multiple GraalPy contexts that access native modules within |
| 30 | +the same JVM. This includes the case when you create a context, close it and then create another context. The second |
| 31 | +context will not be able to access native extensions. |
0 commit comments