2

我正在使用下面的代码python script从 a 中执行 a Java class

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方法,因为它每次执行都会产生一个新进程。

4

1 回答 1

1

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

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 脚本平台。但我没有知识来扩展它。

于 2015-04-09T17:08:56.217 回答