使用Graal python从Java获取外部环境参数

时间:2018-08-11 17:59:43

标签: java python graalvm

我正在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传递给其他内容的文档。

1 个答案:

答案 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);
    }
}