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

Jython listed by `getEngineFactories`, but `getEngineByName("jython")` is `null`

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

<dependency>
  <groupId>org.python</groupId>
  <artifactId>jython</artifactId>
  <version>2.7.0</version>
</dependency>

然后我创建了一个包 src/main/java/mypkg 并添加了这个 class:

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

管理器 returns null,但在下一行中列出了 python/jython 可用的脚本引擎。

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

这是一种解决方法:

在顶部添加:

import org.python.core.Options;

在调用getEngineByName之前,设置

   Options.importSite = false;

然后引擎创建没有问题。

this conversation 得到解决方案。


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

您要么需要使用 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 环境。

解决此问题的一种方法是将环境变量 jythonpath 设置为包含实例所需的特定 Lib 目录(并包含 Lib\site-packages 以避免进一步特定包的问题)