Я создал проект 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?
Вот один способ:
Добавьте это вверху:
import org.python.core.Options;
Перед getEngineByName
установите
Options.importSite = false;
Тогда двигатель создается без проблем.
Получил решение из этого разговора.
Еще одно решение, которое работает хорошо (предложенный mzjn в комментариях) должен заменить jython
артефакт на jython-standalone
.
Вам либо нужно отключить 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.
importSite
опция importSite
и для чего site.py
Буду ли я попадать в неприятности, как только я попытаюсь выйти за рамки print('hello')
если site.py
не импортирован? Что это меняет?
Lib
. Он содержит несколько модулей python
которые он использует для формирования базовой системы Python. Таким образом, вы можете import io
или import pickle
и т. Д.
Одним из способов решения этой jythonpath
является установка env var jythonpath
для включения определенного каталога Lib
, необходимого для вашего экземпляра (и включения также Lib\site-packages
чтобы избежать дальнейших проблем с конкретными пакетами)