Jython указан в списке `getEngineFactories`, но` getEngineByName («jython») `равен нулю

1

Я создал проект 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?

  • 0
    Какую версию Java вы используете?
  • 1
    stackoverflow.com/a/33025866/2834978
Показать ещё 4 комментария
Теги:
jsr223
jython

3 ответа

0
Лучший ответ

Вот один способ:

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

import org.python.core.Options;

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

   Options.importSite = false;

Тогда двигатель создается без проблем.

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


Еще одно решение, которое работает хорошо (предложенный mzjn в комментариях) должен заменить jython артефакт на jython-standalone.

1

Вам либо нужно отключить 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
    Простите мне этот, возможно, глупый вопрос, но что вы подразумеваете под «извлечением»? Я нигде ничего не извлекал, я просто добавил пять строк в POM и надеялся, что смогу использовать движок, как и любую другую зависимость. Боюсь, что я до сих пор не понимаю, что importSite опция importSite и для чего site.py Буду ли я попадать в неприятности, как только я попытаюсь выйти за рамки print('hello') если site.py не импортирован? Что это меняет?
  • 0
    Установите jython, используя установочный файл с их сайта, он содержит папку Lib . Он содержит несколько модулей python которые он использует для формирования базовой системы Python. Таким образом, вы можете import io или import pickle и т. Д.
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню