graalpy-maven-plugin' 自己的靴子级路径省略了 Truffle 的 NFI 语言, 所以需要 QQctypes 的 失败
作者: zenbones创建于 2026年8月30日更新于 2026年9月4日
标签bugpython
根本原因 — 直接通过调用 GraalPythonMain 并使用插件本身记录的内部引导类路径来重现此问题:
$ java ... -classpath <plugin's own logged classpath> com.oracle.graal.Python.shell.GraalPythonMain -c "import _ctypes"
java.lang.IllegalStateException: No language for id nfi found. Supported languages are: [Python, regex]
at com.oracle.truffle.polyglot.PolyglotEngineImpl.findLanguage(PolyglotEngineImpl.java:952)
at com.oracle.graal.Python.builtins.modules.ctypes.CtypesModuleBuiltins$DlOpenNode.load(CtypesModuleBuiltins.java:673)
at com.oracle.graal.Python.builtins.modules.ctypes.CtypesModuleBuiltins.postInitialize(CtypesModuleBuiltins.java:270)
...GraalPy 的 _ctypes 模块是基于 Truffle 的 NFI (原生函数接口) 语言实现的。graalpy-maven-plugin 为其内部的 GraalPythonMain 调用构建的类路径中仅注册了 Python 和 regex Truffle 语言 — nfi 从未出现在其中。任何需要 _ctypes (显式 import ctypes/_ctypes、comtypes 和显然某些 GraalPy 版本的 site 初始化) 的代码路径都会出现此 IllegalStateException,GraalPythonMain 会将其呈现给用户,以更加混淆的形式显示为 ModuleNotFoundError: No module named '_ctypes'。
内容来源: oracle/graal