我使用下面的代码从python script
:
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
方法因为它会在每次执行时生成一个新进程。
答案 0 :(得分:0)
您需要稍微更改一下以调用函数。
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脚本平台。但我没有足够的知识来扩展它。