You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 11:45:07