GraalVM中Java Map传递至Python失败及双向交互需求
Java Map与GraalVM Python互传问题解决
问题场景
需要实现Java Map传递至GraalVM Python代码,在Python中访问Map值、处理后存回Map,再返回Java端访问,但目前卡在传递后访问Map的环节。
尝试的Java代码
import java.util.HashMap; import java.util.Map; import org.graalvm.polyglot.Context; import org.graalvm.polyglot.Value; public class PythonJavaMap { public static void main(String[] args) { Map<String, String> javaMap = new HashMap<>(); javaMap.put("key1", "value1"); javaMap.put("key2", "value2"); try (Context context = Context.create()) { context.getBindings("python").putMember("java_map", javaMap); Value result = context.eval("python", "for key, value in java_map.items(): print(value)"); } } }
运行报错
Exception in thread "main" AttributeError: foreign object has no attribute 'items' at <python> <module>(Unknown) at org.graalvm.polyglot.Context.eval(Context.java:428) at com.mindSynth.PythonJavaMap.main(PythonJavaMap.java:18)
解决方案
Java的Map对象在GraalVM Python中是作为外部对象存在的,不会自动映射为Python原生dict,因此无法直接调用Python的items()方法。可以通过两种方式解决:
方式一:直接调用Java Map的原生方法
Java的Map提供了entrySet()方法获取键值对集合,在Python中可以直接调用该方法遍历:
修改Java代码中的Python执行语句为:
Value result = context.eval("python", "for entry in java_map.entrySet():\n print(entry.getKey(), entry.getValue())");
方式二:转换为Python原生dict
利用GraalVM的polyglot模块将Java Map转换为Python字典,之后即可使用Python原生字典的所有方法:
修改Java代码中的Python执行语句为:
Value result = context.eval("python", "import polyglot\npy_dict = dict(polyglot.from_java(java_map))\nfor key, value in py_dict.items():\n print(key, value)");
处理结果存回Java Map
如果需要在Python中修改Java Map并返回Java端访问,直接调用Java Map的put方法即可:
# 在Python代码中添加 java_map.put("new_key", "processed_value")
回到Java端后,javaMap会包含新增的键值对,可直接通过javaMap.get("new_key")访问。
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

