我创建了一个默认的Maven Java项目并添加了以下依赖项:
<dependency>
<groupId>org.python</groupId>
<artifactId>jython</artifactId>
<version>2.7.0</version>
</dependency>
然后我创建了一个包src/main/java/mypkg
并添加了此类:
package mypkg;
import javax.script.*;
class JythonMinimalTest {
public static void main(String[] args) throws Exception {
String engineName = "python";
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName(engineName);
if (engine == null) {
System.err.println("ERROR: `" + engineName + "` not available.");
System.err.println("Available engines: ");
for (ScriptEngineFactory factory: manager.getEngineFactories()) {
System.err.println(factory);
System.err.println("names:");
for (String name: factory.getNames()) {
System.err.println(" " + name);
}
}
System.exit(999);
}
engine.eval("print('hello, world')");
}
}
当我使用exec:java
运行它时,
mvn exec:java -Dexec.mainClass=mypkg.JythonMinimalTest
我得到以下神秘输出:
ERROR: `python` not available.
Available engines:
org.python.jsr223.PyScriptEngineFactory@2b0e6c89
names:
python
jython
jdk.nashorn.api.scripting.NashornScriptEngineFactory@46618cb8
names:
nashorn
Nashorn
js
JS
JavaScript
javascript
ECMAScript
ecmascript
管理器返回null
,但随后在下一行中列出可用脚本引擎中的python
/ jython
。
Nashorn以完全相同的方式工作得很好。 Jython我怎么了?
答案 0 :(得分:1)
您已经需要使用python选项禁用importSite
,正如您已经发现的那样。或者,将python.home
设置为您提取jython
的位置。我将其提取到jython2.7.0
下的主文件夹中;添加它,
System.setProperty("python.home", new File(
System.getProperty("user.home"), "jython2.7.0").getPath()
);
允许python发现正确的PYPATH
,以便它可以构建python环境。
答案 1 :(得分:0)
这是一种解决方法:
将此添加到顶部:
import org.python.core.Options;
在调用getEngineByName
之前,先设置
Options.importSite = false;
然后,引擎创建成功。
从this conversation获得解决方案。
另一个可行的解决方案(由mzjn在评论中提出)是将jython
工件替换为jython-standalone
。
答案 2 :(得分:0)
解决此问题的一种方法是将环境变量jythonpath
设置为包括实例所需的特定Lib
目录(并包括Lib\site-packages
以避免进一步的问题)特定软件包)