Jython 由 `getEngineFactories` 列出,但 `getEngineByName("jython")` 为 `null`

And*_*kin 2 python java jython jsr223

我创建了一个默认的 Maven Java 项目并添加了以下依赖项:

<dependency>
  <groupId>org.python</groupId>
  <artifactId>jython</artifactId>
  <version>2.7.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个包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')");
    }
}
Run Code Online (Sandbox Code Playgroud)

当我使用运行它时exec:java

mvn exec:java -Dexec.mainClass=mypkg.JythonMinimalTest
Run Code Online (Sandbox Code Playgroud)

我得到以下神秘的输出:

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
Run Code Online (Sandbox Code Playgroud)

管理器返回null,但随后在下一行列出python/jython可用的脚本引擎。

Nashorn 以完全相同的方式工作得很好。我对 Jython 做错了什么?

And*_*kin 9

这是一种解决方法:

在顶部添加此内容:

import org.python.core.Options;
Run Code Online (Sandbox Code Playgroud)

调用前getEngineByName,设置

   Options.importSite = false;
Run Code Online (Sandbox Code Playgroud)

然后引擎就创建成功了。

从这次谈话中得到了解决方案。


另一个效果很好的解决方案(由 mzjn 在评论中提出)是将jython工件替换为jython-standalone.