代码之家  ›  专栏  ›  技术社区  ›  Andrey Tyukin

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

  •  1
  • Andrey Tyukin  · 技术社区  · 7 年前

    <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

    纳索恩也用同样的方法工作得很好。我对Jython有什么错?

    2 回复  |  直到 7 年前
        1
  •  3
  •   Andrey Tyukin    7 年前

    这里有一个解决方法:

    import org.python.core.Options;
    

    在调用之前 getEngineByName

       Options.importSite = false;
    

    this conversation .


    另一个很好的解决方案(由mzjn在评论中提出)是替换 jython jython-standalone

        2
  •  1
  •   Elliott Frisch    7 年前

    你要么需要禁用 importSite 使用python选项,正如您已经发现的。或者,设置 python.home 去你提取的地方 jython . 我把它解压在我的主文件夹下 jython2.7.0

    System.setProperty("python.home", new File(
            System.getProperty("user.home"), "jython2.7.0").getPath()
    );
    

    允许python发现正确的 PYPATH 因此它可以构建python环境。

        3
  •  0
  •   roetzi    6 年前

    解决这个问题的一种方法是设置env var jythonpath 包括具体的 Lib 实例所需的目录(包括 Lib\site-packages 以及避免特定程序包的进一步问题)