Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在使用ScriptEngine从Java运行python脚本时调用python脚本中的函数并传递参数_Java_Python_Scriptengine - Fatal编程技术网

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

如何在使用ScriptEngine从Java运行python脚本时调用python脚本中的函数并传递参数,java,python,scriptengine,Java,Python,Scriptengine,我使用下面的代码从Java类中执行python脚本: import javax.script.ScriptContext; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.SimpleScriptContext; StringWriter writer = new StringWriter(); ScriptEngineManager manager =

我使用下面的代码从
Java类中执行
python脚本

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脚本
的更好方法是使用
进程
,但由于系统要求,我不想使用
进程
方法,因为每次执行都会产生一个新的进程。

您需要稍微更改它来调用函数

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
作为脚本。这意味着您可以使用它来调用函数,前提是您与已运行的脚本处于相同的“范围”。这是通过在引擎中设置上下文来实现的,而不是将其作为参数传递给
eval


注意:在您的问题中,您说您知道在单独的进程中运行python可能会更好。这不一定是真的。例如,如果从另一个进程运行函数,则从它调用函数(并获取其返回值!)会困难得多。脚本扩展允许您这样做


另一种选择是直接使用Jython,而不是通过标准Java脚本平台。但是我不知道如何扩展它。

使用Jython而不是原始脚本引擎。@MalikBrahimi你能给我举个例子,说明如何使用Jython完全执行python脚本吗,在python脚本中执行一个函数,同时向该函数传递参数?@MalikBrahimi也是脚本引擎无法满足的上述要求吗?@也许,但即使这样做也很困难,也不合逻辑。@MalikBrahimi您能给我举个例子,说明如何使用jython完全执行python脚本吗,在python脚本中执行函数,同时将参数传递给该函数?谢谢您的回答!我对您所说的“我假设您正在使用它编写python脚本”的意思表示怀疑?我有maven的jython_单机版2.5.2。这就是你的意思吗?在我的代码中,我正在导入
import javax.script.ScriptContext;导入javax.script.ScriptEngine;导入javax.script.ScriptEngineManager;导入javax.script.SimpleScriptContext导入的内容并不多。你只是没有提到你正在使用什么作为Python引擎,我不确定jython是否是唯一的一个。所以我说我假设你正在使用它。如果它位于类路径/构建路径上,那么它就是您正在使用的路径。如果我想将命令行参数传递到
test.py
,该怎么办?看看这个问题: