【问题标题】:Jython listed by `getEngineFactories`, but `getEngineByName("jython")` is `null`Jython 由 `getEngineFactories` 列出,但 `getEngineByName("jython")` 为 `null`
【发布时间】:2018-10-15 22:12:42
【问题描述】:

我创建了一个默认的 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 时做错了什么?

【问题讨论】:

  • 您使用的是什么版本的 Java?
  • @ElliottFrisch maven 同时使用 1.8:&lt;maven.compiler.source&gt;1.8&lt;/maven.compiler.source&gt; &lt;maven.compiler.target&gt;1.8&lt;/maven.compiler.target&gt;,java 本身也是 1.8.0
  • 如果您使用 jython-standalone 而不是 jython 作为 artifactId 会发生什么(参见 Luis Muñoz 的评论)?
  • @mzjn 实际上,使用 jython-standalone 2.7.1,我不需要任何 Option.loadSite=false hack,它可以立即按预期工作。请注意,jython-standalone.jar 占用 40MB 而不是 30MB。此解决方案在{Andrew 在 {Luis Muñoz 链接的问题}} 中提到的问题:whats-the-difference-between-jython-standalone-2-7-0-jar-and-jython-2-7-0-jar,但没有公认的答案...

标签: java python jython jsr223


【解决方案1】:

这是一种解决方法:

在顶部添加:

import org.python.core.Options;

在调用getEngineByName之前,设置

   Options.importSite = false;

然后引擎创建没有问题。

this conversation获得解决方案。


另一个行之有效的解决方案(由 cmets 中的 mzjn 提出)是将 jython 工件替换为 jython-standalone

【讨论】:

    【解决方案2】:

    正如您已经发现的那样,您需要使用 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环境。

    【讨论】:

    • 请原谅我这个可能很愚蠢的问题,但是“提取”是什么意思?我没有在任何地方提取任何东西,我只是在 POM 中添加了五行,并希望我可以像使用任何其他依赖项一样使用引擎。恐怕我还是不明白importSite 选项有什么作用,site.py 有什么用处。如果site.py 未导入,我是否会在尝试超越print('hello') 时遇到麻烦?它有什么不同?
    • 使用他们网站上的installer file 安装jython,它包含一个Lib 文件夹。它包含一堆python 模块,用于形成基本的python 系统。所以你可以import ioimport pickle 等。
    【解决方案3】:

    解决此问题的一种方法是设置 env var jythonpath 以包含您的实例所需的特定 Lib 目录(并包括 Lib\site-packages 以及避免特定软件包出现进一步问题)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-30
      • 1970-01-01
      • 2012-05-02
      • 2011-07-21
      • 1970-01-01
      • 1970-01-01
      • 2018-06-30
      • 1970-01-01
      相关资源
      最近更新 更多