Experimental feature in GraalVM

原生扩展支持

CPython 提供了一个 原生扩展 API,用于使用 C/C++ 编写 Python 扩展。GraalPy 为此 API 提供了实验性支持,这使得许多包(如 NumPy 和 PyTorch)在许多用例中都能很好地工作。支持仅扩展到 API,而不是二进制接口 (ABI),因此为 CPython 构建的扩展与 GraalPy 不兼容。使用原生 API 的包必须使用 GraalPy 构建和安装,并且不能使用 pypi.org 上为 CPython 预构建的轮子。为了获得最佳结果,至关重要的是您只使用 GraalPy 虚拟环境中预安装的 pip 命令来安装包。GraalPy 附带的 pip 版本在安装时会对包应用额外的补丁,以修复已知的兼容性问题,并且预先配置为使用来自 graalvm.org 的一个额外存储库,我们在其中发布了 GraalPy 的部分预构建轮子。请勿更新 pip 或使用 uv 等其他工具。

嵌入限制 #

Python 原生扩展默认情况下作为原生二进制文件运行,可以完全访问底层系统。原生代码没有沙箱,可以绕过 Truffle 或 JVM 提供的任何保护措施,直至包括终止整个进程。原生数据结构不受 Java GC 的约束,它们与 Java 数据结构的组合可能会导致内存泄漏。原生库通常不能多次加载到同一个进程中,并且它们可能包含无法安全重置的全局状态。因此,无法创建多个在同一个 JVM 中访问原生模块的 GraalPy 上下文。这包括当您创建一个上下文,关闭它,然后创建一个其他上下文的情况。第二个上下文将无法访问原生扩展。

联系我们