Jython 由 `getEngineFactories` 列出,但 `getEngineByName("jython")` 为 `null`
Jython listed by `getEngineFactories`, but `getEngineByName("jython")` is `null`
我创建了一个默认的 Maven Java 项目并添加了以下依赖项:
<dependency>
<groupId>org.python</groupId>
<artifactId>jython</artifactId>
<version>2.7.0</version>
</dependency>
然后我创建了一个包 src/main/java/mypkg
并添加了这个 class:
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
管理器 returns null
,但在下一行中列出了 python
/jython
可用的脚本引擎。
Nashorn 以完全相同的方式工作得很好。我在使用 Jython 时做错了什么?
这是一种解决方法:
在顶部添加:
import org.python.core.Options;
在调用getEngineByName
之前,设置
Options.importSite = false;
然后引擎创建没有问题。
从 this conversation 得到解决方案。
另一种效果很好的解决方案(由 mzjn 在评论中提出)是将 jython
工件替换为 jython-standalone
。
您要么需要使用 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 环境。
解决此问题的一种方法是将环境变量 jythonpath
设置为包含实例所需的特定 Lib
目录(并包含 Lib\site-packages
以避免进一步特定包的问题)
我创建了一个默认的 Maven Java 项目并添加了以下依赖项:
<dependency>
<groupId>org.python</groupId>
<artifactId>jython</artifactId>
<version>2.7.0</version>
</dependency>
然后我创建了一个包 src/main/java/mypkg
并添加了这个 class:
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
管理器 returns null
,但在下一行中列出了 python
/jython
可用的脚本引擎。
Nashorn 以完全相同的方式工作得很好。我在使用 Jython 时做错了什么?
这是一种解决方法:
在顶部添加:
import org.python.core.Options;
在调用getEngineByName
之前,设置
Options.importSite = false;
然后引擎创建没有问题。
从 this conversation 得到解决方案。
另一种效果很好的解决方案(由 mzjn 在评论中提出)是将 jython
工件替换为 jython-standalone
。
您要么需要使用 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 环境。
解决此问题的一种方法是将环境变量 jythonpath
设置为包含实例所需的特定 Lib
目录(并包含 Lib\site-packages
以避免进一步特定包的问题)