我正在GraalVM中运行Java以使用它执行python。
Context context = Context.create();
Value v = context.getPolyglotBindings();
v.putMember("arguments", arguments);
final Value result = context.eval("python", contentsOfMyScript);
System.out.println(result);
return jsResult;
问题是python代码应如何接收“参数”。 graal文档指出,如果这是JS,我会这样做:
const args = Interop.import('arguments');
确实可以。等效的python可能是:
import Interop
args = Interop.import('arguments')
def main():
return args
main()
这失败了,因为没有这样的模块。我找不到有关如何从外部语言层获取这些参数的文档,仅找到有关pythongraal的文档以及如何使用python传递给其他内容的文档。
答案 0 :(得分:6)
有关此方面的某些信息,请访问http://www.graalvm.org/docs/reference-manual/polyglot/。
您要查找的模块称为polyglot
。
在Python中,该操作称为import_value
,因为import
是关键字。
您可以使用以下方法从多语言绑定中导入:
import polyglot
value = polyglot.import_value('name')
顺便说一句,在JavaScript中几乎是一样的:Polyglot.import(name)
(出于兼容性原因,Interop
仍然有效)
完整的示例:
import org.graalvm.polyglot.*;
class Test {
public static void main(String[] args) {
Context context = Context.newBuilder().allowIO(true).build();
Value v = context.getPolyglotBindings();
v.putMember("arguments", 123);
String script = "import polyglot\n" +
"polyglot.import_value('arguments')";
Value array = context.eval("python", "[1,2,42,4]");
Value result = context.eval("python", script);
System.out.println(result);
}
}