Jython由`getEngineFactories`列出,但是`getEngineByName(“ jython”)`为`null`

时间:2018-10-15 22:12:43

标签: java python jython jsr223

我创建了一个默认的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我怎么了?

3 个答案:

答案 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以避免进一步的问题)特定软件包)