将Java Map传递给GraalVM Python并返回

-1 投票
1 回答
24 浏览
提问于 2025-04-13 18:51

我想把Java中的一个地图(map)传给Python代码,然后在Python中访问这个地图的值,接着把结果存储在一个地图里,最后再在Java中访问这些结果。不过,我在第一步,也就是把Java地图传给Python这一步卡住了。

我尝试了以下代码,但没有成功。

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)

1 个回答

0

下面的代码可以正常运行,结果发现我需要开启主机访问权限。


import java.util.HashMap;
import java.util.Map;
import org.graalvm.polyglot.Context;
import org.graalvm.polyglot.Value;

public class PythonMapMap {
  @FunctionalInterface interface MapFunction { Map my_function(Map input); }

  public static void main(String[] args) {
    Context context = Context.newBuilder().allowHostAccess(true).build();

    Value function = context.eval("python",
        """
            def my_function(fname):
                print(fname)
                methods_and_attributes = dir(fname)
                print(methods_and_attributes)
                print(fname["test"])
                print(fname.get("test"))
                result = HashMap()
                result['foo'] = 5
                return result;
            """);
    Map<String, Object> input = new HashMap<>();
    input.put("test", "test_value");
    System.out.println(function.as(MapFunction.class)
        .my_function(input));
  }
}


撰写回答