将Java Map传递给GraalVM Python并返回
我想把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));
}
}