Jython перечислен в `getEngineFactories`, но` getEngineByName ("jython") `имеет значение` null` - PullRequest
0 голосов
/ 16 октября 2018

Я создал проект 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 среди доступных скриптовых движков.

Нашорн прекрасно работал точно так же.Что я делаю не так с Jython?

Ответы [ 3 ]

0 голосов
/ 16 октября 2018

Вам также нужно отключить 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.

0 голосов
/ 22 июня 2019

Одним из способов решения этой проблемы является установка env var jythonpath для включения определенного каталога Lib, необходимого для вашего экземпляра (и включения Lib\site-packages, чтобы избежать дальнейших проблем с конкретными пакетами)

0 голосов
/ 16 октября 2018

Вот один из обходных путей:

Добавьте это вверху:

import org.python.core.Options;

Перед вызовом getEngineByName установите

   Options.importSite = false;

Затем создается движокбез проблем.

Получил решение из этого разговора .


Другое решение, которое хорошо работает (предложено mzjn в комментариях), состоит в замене jython артефакта наjython-standalone.

...