Javas Scripting API wird in JSR 223 definiert. Die meisten Scriptsprachen - auch Jython - behaupten, dies zu unterstützen.
Der Standard bei Java zur Verwaltung von Bibliotheken ist Maven. Der Weg zu Jython sollte also (für Java-Verhältnisse) einfach ein POM mit
Code: Alles auswählen
<dependency>
<groupId>org.python</groupId>
<artifactId>jython</artifactId>
<version>2.5.0</version>
</dependency>
Der folgende Code lädt dann Jython und führt ein Beispiel aus:
Code: Alles auswählen
ScriptEngine engine = new ScriptEngineManager().getEngineByName("python");
System.out.println(engine.eval("3+4"));
Dennoch, ich brauche 2.5.1, einen Download gibt es leider nur in Form eines IMHO unpraktischen Java-basierten Installers. Ich wähle Standalone, weil ich glaube, dass dies der Version aus dem Maven-Repo entspricht. Das legt mir ein 8,7 MB großes jar unter /Users/sma/jython2.5.1 ab.
Ich ändere die Maven-Dependency auf 2.5.1, installiere das jar mit ``mvn install:install-file -DgroupId=org.python -DartifactId=jython -Dversion=2.5.1 -Dpackaging=jar -Dfile=/Users/sma/jython2.5.1/jython.jar`` zumindest in mein lokales Repo und versuche es erneut.
Es geht.
Nachstehendes Testprogramm liefert jedoch (wie im Bug-Report erwähnt), das falsche Ergebnis (2x 2 statt 1x 1 und 1x 2). Dabei sind die `Bindings` schon unterschiedlich. Und `b1.get("a")` und `b2.get("a") liefert jeweils null, was IMHO auch falsch ist.
Code: Alles auswählen
Bindings b1 = engine.createBindings();
Bindings b2 = engine.createBindings();
engine.eval("a = 1", b1);
engine.eval("a = 2", b2);
System.out.println(engine.eval("a", b1));
System.out.println(engine.eval("a", b2));
Aber man kann Jython ja auch direkt - ohne JSR 223 - einbetten. Es gibt sogar ein Buch zu Jython. Leider warnt Safari davor, dass die Webseite jythonbook.com Malware enthält. Hoffentlich ist das nur welche für Windows, denn Firefox hat mir die Seite einfach angezeigt. Googles Safe Browsing Dienst sagt, dass auf der Startseite am 06.12.2009 ein schädliches Programm gefunden wurde (ob es noch existiert, sagen sie nicht). Scary.
Ist es wirklich so einfach?
Code: Alles auswählen
PythonInterpreter interpreter1 = new PythonInterpreter();
PythonInterpreter interpreter2 = new PythonInterpreter();
interpreter1.exec("a = 1");
interpreter2.exec("a = 2");
interpreter1.exec("print a");
interpreter2.exec("print a");
Stefan