【问题标题】:Getting outer environment arguments from java using graal python使用graal python从java获取外部环境参数
【发布时间】:2018-08-11 17:59:43
【问题描述】:

我在 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 传递给其他东西。

【问题讨论】:

    标签: java python graalvm


    【解决方案1】:

    有关这方面的一些信息,请访问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);
        }
    }
    

    【讨论】:

    • 谢谢。您将我指向我之前查看的相同文档,而我从您的回答中意识到,无论语言是主机还是来宾,库都没有什么不同。我一直在想我在看一些不相关的例子,其中 python 是主机,这不是我想要的。
    • @FrobberOfBits 为简化此示例,您还可以直接写入语言绑定的顶级范围:context.getBindings("python").putMember("arguments", 123) 在 Python 中,您可以直接访问 arguments,就好像它是顶级中的变量一样-最范围。例如。 context.eval("python", "arguments + 42") 工作。
    • @ChristianHumer 我尝试使用您在此处建议的方法将顶级范围绑定与 Python 结合使用。但是,即使复制您发布的确切示例,我也会收到以下错误:org.graalvm.polyglot.PolyglotException: java.lang.AssertionError: Returned scope variables object must be a TruffleObject.使用多语言绑定可以正常工作。可能是什么问题?谢谢。
    • @edoDev GraalPython 仍处于早期和实验阶段,因此某些功能尚未实现。我认为这个问题已经在较新的版本中得到修复。你用的是哪个版本?否则请向 GraalPython repo 报告错误。
    • @ChristianHumer 我正在运行“Graal Python 3.7.0 (GraalVM CE Native 1.0.0-rc4)”。我应该提交错误报告吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多