繁体   English   中英

如何在使用ScriptEngine从Java运行python脚本的同时调用python脚本内的函数并传递参数

[英]How to call a function inside a python script and pass parameters while using ScriptEngine to run python script from Java

我正在使用以下代码从Java class执行python script

import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.SimpleScriptContext;

StringWriter writer = new StringWriter();
ScriptEngineManager manager = new ScriptEngineManager();
ScriptContext context = new SimpleScriptContext();
context.setWriter(writer);
ScriptEngine engine = manager.getEngineByName("python");
engine.eval(new FileReader("test.py"), context);

我想知道如何使用上述方法在test.py调用一个函数,并将一些参数传递给该函数?

注意:我知道执行python script的更好方法是使用Process但是由于系统要求,我不想使用Process方法,因为它在每次执行时都会产生一个新进程。

您需要对其稍作更改以调用函数。

ScriptContext context = new SimpleScriptContext();
context.setWriter(writer);
ScriptEngine engine = manager.getEngineByName("python");

// CHANGE: Set the context in the engine, so that invoking functions
// is done in the same scope as evaluating the script.
engine.setContext(context);

engine.eval(new FileReader("test.py"));

Invocable inv = (Invocable)engine;
inv.invokeFunction("func_name", param1, param2);

基本上,Jython引擎(我假设您正在使用python编写脚本)允许您将其ScriptEngine用作Invocable 这意味着您可以使用它来调用函数,前提是您与运行的脚本位于同一“作用域”中。 这是通过在引擎中设置上下文而不是将其作为参数传递给eval


注意:在您的问题中,您说自己知道,在单独的进程中运行python可能会更好。 不一定是真的。 例如,如果您从其他进程运行该函数,则从该函数调用函数(并获取其返回值!)将变得非常困难。 脚本扩展允许您执行此操作。

另一种选择是直接使用Jython,而不通过标准Java脚本平台使用。 但是我不具备对此进行扩展的知识。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM