我写了一个Java示例,代码是:
import org.python.core.PyObject;
import org.python.util.PythonInterpreter;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.util.List;
class JythonExample {
public static void main(String args[]) throws ScriptException {
listEngines();
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine pyEngine = mgr.getEngineByName("python");
try {
pyEngine.eval("print \"Python - Hello, world!\"");
} catch (Exception ex) {
ex.printStackTrace();
}
final PythonInterpreter interpreter = new PythonInterpreter();
interpreter.exec("print \"Python - Hello, world!\"");
PyObject result = interpreter.eval("2 + 3");
System.out.println(result.toString());
}
public static void listEngines(){
ScriptEngineManager mgr = new ScriptEngineManager();
List<ScriptEngineFactory> factories =
mgr.getEngineFactories();
for (ScriptEngineFactory factory: factories) {
System.out.println("ScriptEngineFactory Info");
String engName = factory.getEngineName();
String engVersion = factory.getEngineVersion();
String langName = factory.getLanguageName();
String langVersion = factory.getLanguageVersion();
System.out.printf("\tScript Engine: %s (%s)\n",
engName, engVersion);
List<String> engNames = factory.getNames();
for(String name: engNames) {
System.out.printf("\tEngine Alias: %s\n", name);
}
System.out.printf("\tLanguage: %s (%s)\n",
langName, langVersion);
}
}
}
Run Code Online (Sandbox Code Playgroud)
在我的pom.xml,如果我使用:
<dependency>
<groupId>org.python</groupId>
<artifactId>jython-standalone</artifactId>
<version>2.7.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
然后我可以java -jar target/jython-example-1.0-SNAPSHOT.jar成功地运行,顺便说一下,我曾经maven-assembly-plugin建立了一个可运行的jar.
如果我使用:
<dependency>
<groupId>org.python</groupId>
<artifactId>jython</artifactId>
<version>2.7.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
然后当我跑步时java -jar target/jython-example-1.0-SNAPSHOT.jar,我总会得到以下错误:
ScriptEngineFactory Info
Script Engine: jython (2.7.0)
Engine Alias: python
Engine Alias: jython
Language: python (2.7)
ScriptEngineFactory Info
Script Engine: Oracle Nashorn (1.8.0_31)
Engine Alias: nashorn
Engine Alias: Nashorn
Engine Alias: js
Engine Alias: JS
Engine Alias: JavaScript
Engine Alias: javascript
Engine Alias: ECMAScript
Engine Alias: ecmascript
Language: ECMAScript (ECMA - 262 Edition 5.1)
java.lang.NullPointerException
at me.soulmachine.JythonExample.main(JythonExample.java:21)
Exception in thread "main" ImportError: Cannot import site module and its dependencies: No module named site
Determine if the following attributes are correct:
* sys.path: ['/home/programmer/src/github/JythonExample/JythonExample/target/Lib', '__classpath__', '__pyclasspath__/']
This attribute might be including the wrong directories, such as from CPython
* sys.prefix: /home/programmer/src/github/JythonExample/JythonExample/target
This attribute is set by the system property python.home, although it can
be often automatically determined by the location of the Jython jar file
You can use the -S option or python.import.site=false to not import the site module
Run Code Online (Sandbox Code Playgroud)
看来pyEngine是的null.
所以我想知道jython-standalone-2.7.0.jar和之间的区别是什么jython-2.7.0.jar
我刚刚发现的同一个错误的一个问题是maven build 2.7.0不包含lib文件夹.这可能是发布版本的构建错误.我不得不向上移动b2构建,它正确地包含了提供的jar中的lib文件夹.
问题maven 2.7.0 jar:
<dependency>
<groupId>org.python</groupId>
<artifactId>jython-standalone</artifactId>
<version>2.7.0</version>
</dependency>
使用包含lib文件夹的maven 2.7.1b2:
<dependency>
<groupId>org.python</groupId>
<artifactId>jython-standalone</artifactId>
<version>2.7.1b2</version>
</dependency>
注意:如果直接从Jython站点下载jar,它确实包含lib文件夹.它只是maven存储库版本.
我相信导致您问题的主要区别是 jython-standalone jar 提供 Lib/ (其中包含 site.py),而 jython jar 不提供。
https://github.com/scijava/jython-shaded更深入地描述了该问题以及其他问题,并提供了替代 jar 来解决描述中指出的一些问题。
我没有 scijava:jython-shaded 的经验,但我将其替换到您的 pom 中(对于我的设置,我还必须将 jdk.version 更改为 1.7 和 JythonExample)并且您的示例运行。
| 归档时间: |
|
| 查看次数: |
5834 次 |
| 最近记录: |