Mit Jython können Sie Python-Skripte auf einer JVM ausführen. Gibt es jemanden, der es benutzt? Du denkst vielleicht, aber ich bin es. Ich bin da.
Jython
Urheber http://www.jython.org/ wikipedia https://ja.wikipedia.org/wiki/Jython
Ich werde schreiben, wie man (Java-Code) und süchtig machende Punkte benutzt.
Als ich es gegoogelt habe, hatte ich den Eindruck, dass es viele Möglichkeiten gibt, es zu installieren und über die Befehlszeile zu verwenden, aber dieses Mal werde ich es mit Java-Code ausführen.
Erster Maven pom.xml
pom.xml
<dependency>
<groupId>org.python</groupId>
<artifactId>jython-standalone</artifactId>
<version>2.7.0</version>
</dependency>
import java.util.Properties;
import org.python.util.PythonInterpreter;
//・ ・ ・
public static void main(String[] args) {
Properties props = new Properties();
props.put("python.console.encoding", "UTF-8");
PythonInterpreter.initialize(System.getProperties(), props, new String[0]);
try (PythonInterpreter interp = new PythonInterpreter()) {
interp.exec("a = 1 + 2");
interp.exec("print(a)");
}
}
Ergebnis (Konsole)
3
Ich war mir nicht sicher, was genau "python.console.encoding" ist, aber ich habe eine Fehlermeldung erhalten, wenn es nicht vorhanden war. Als ich es gegoogelt habe, habe ich es so geschrieben.
import org.python.core.PyInteger;
import org.python.core.PyObject;
//・ ・ ・
public static void main(String[] args) {
Properties props = new Properties();
props.put("python.console.encoding", "UTF-8");
PythonInterpreter.initialize(System.getProperties(), props, new String[0]);
try (PythonInterpreter interp = new PythonInterpreter()) {
PyInteger x = new PyInteger(10);
interp.set("x", x);//Ersetzen Sie x durch 10
interp.exec("a = x + 2");
PyObject a = interp.get("a");//Holen Sie sich das Ergebnis von a
System.out.println(a);
System.out.println(a.getClass());
}
}
Ergebnis
12
class org.python.core.PyInteger
Es gibt verschiedene Implementierungsklassen von PyObject, und Sie können festlegen, dass sie Java-Code und Python-Code austauschen.
PyInteger, wenn Sie int übergeben möchten, PyString, wenn Sie str ... Ich denke, die Japaner sind hier süchtig danach. Siehe weiter.
PyString s = new PyString("AIUEO");
Wenn ich versuche, einen PyString mit der Zeichenfolge "AIUEO" zu generieren, sieht es so aus.
Exception in thread "main" java.lang.IllegalArgumentException: Cannot create PyString with non-byte value
at org.python.core.PyString.<init>(PyString.java:64)
at org.python.core.PyString.<init>(PyString.java:70)
beim ....main(・ ・ ・ ・)
Gununu. Das erste, was Sie verstehen müssen, ist, dass Jython Python 2 unterstützt. Python3-Code funktioniert nicht. (Ich habe nur Python3 studiert, also war ich enttäuscht)
Python2 musste Unicode sein. Damit
public static void main(String[] args) {
Properties props = new Properties();
props.put("python.console.encoding", "UTF-8");
PythonInterpreter.initialize(System.getProperties(), props, new String[0]);
try (PythonInterpreter interp = new PythonInterpreter()) {
PyUnicode s = new PyUnicode("AIUEO");
interp.set("s", s);
interp.exec("a = s * 10");
PyObject a = interp.get("a");
System.out.println(a);
System.out.println(a.getClass());
}
}
Aiue Aiue Aiue Aiue Aiue Aiue Aiue Aiue Aiue Aiue Aiue
class org.python.core.PyUnicode
Ich konnte es schaffen.
Codieren Sie es in einem Python-Skript und behandeln Sie es mit str.
public static void main(String[] args) {
Properties props = new Properties();
props.put("python.console.encoding", "UTF-8");
PythonInterpreter.initialize(System.getProperties(), props, new String[0]);
try (PythonInterpreter interp = new PythonInterpreter()) {
PyUnicode s = new PyUnicode("AIUEO");
interp.set("s", s);
interp.exec("s = s.encode('utf-8')");
interp.exec("a = s * 10");
PyObject a = interp.get("a");
System.out.println(a);
System.out.println(a.getClass());
}
}
ãããããããããããããããããããããããããããããããããããããããããããããããããã
class org.python.core.PyString
Irgendwie hatte ich es erwartet. Umschreiben
public static void main(String[] args) {
Properties props = new Properties();
props.put("python.console.encoding", "UTF-8");
PythonInterpreter.initialize(System.getProperties(), props, new String[0]);
try (PythonInterpreter interp = new PythonInterpreter()) {
PyUnicode s = new PyUnicode("AIUEO");
interp.set("s", s);
interp.exec("s = s.encode('utf-8')");
interp.exec("a = s * 10");
interp.exec("a = a.decode('utf-8')");
PyObject a = interp.get("a");
System.out.println(a);
System.out.println(a.getClass());
}
}
Aiue Aiue Aiue Aiue Aiue Aiue Aiue Aiue Aiue Aiue Aiue
class org.python.core.PyUnicode
Es war in Ordnung, wenn ich es vor dem Aufnehmen der Variablen in Unicode dekodierte.
public static void main(String[] args) {
Properties props = new Properties();
props.put("python.console.encoding", "UTF-8");
PythonInterpreter.initialize(System.getProperties(), props, new String[0]);
try (PythonInterpreter interp = new PythonInterpreter()) {
PyUnicode s = new PyUnicode("a ah");
interp.set("s", s);
interp.exec("s = s.encode('utf-8')");
interp.exec("a = s.upper()");
interp.exec("a = a.decode('utf-8')");
PyObject a = interp.get("a");
System.out.println(a);
System.out.println(a.getClass());
}
}
Wo erwartet man das Ergebnis "A a"?
Exception in thread "main" Traceback (most recent call last):
File "<string>", line 1, in <module>
File "・ ・ ・\repository\org\python\jython-standalone\2.7.0\jython-standalone-2.7.0.jar\Lib\encodings\utf_8.py", line 16, in decode
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x82 in position 3: unexpected code byte
Wenn ich mich mit Python beschäftige, scheint es ein Fehler zu sein, weil "new PyString ()" fertig ist und Multi-Byte-Zeichen enthalten sind. vielleicht. Es scheint, dass es hier keine andere Problemumgehung gibt, als den Code sorgfältig zu schreiben. Es ist besser, Unicode anstelle von str zu verwenden. (Bitte weisen Sie darauf hin, ob es eine Methode gibt) Es kann jedoch nicht geholfen werden, wenn es in einer externen Python-Bibliothek verwendet wird. Wunder? .. .. ..
Erstellen Sie die folgende py-Datei in einem Verzeichnis
sample.py
# coding:utf-8
def add_numbers(a, b):
return a + b
Laden Sie dies und führen Sie es aus
public static void main(String[] args) {
Properties props = new Properties();
props.put("python.path", "[Beispiel oben.Verzeichnis mit py]");
props.put("python.console.encoding", "UTF-8");
PythonInterpreter.initialize(System.getProperties(), props, new String[0]);
try (PythonInterpreter interp = new PythonInterpreter()) {
interp.exec("import sample"); //sample.py importieren
interp.exec("a = sample.add_numbers(2, 3)");
interp.exec("print(a)");
}
}
5
Setzen Sie das Verzeichnis auf "python.path".
Wenn es mehrere gibt, kann dies anscheinend durch Verbinden mit einem Trennzeichen behoben werden. (Windows ;
)
http://www.jython.org/archive/22/userfaq.html#my-modules-can-not-be-found-when-imported-from-an-embedded-application
sys.path.append
aus dem Python-Code gelesen werden kann.
(Ich habe es noch nicht im Glas versucht.)Sie können die py-Datei auch im Glas ausführen.
Wie zu spezifizieren
Geben Sie [Path.jar with Jar] \ [Ordnername in jar with py file]
an.
Wenn sich in einem Ordner namens python im jar eine py-Datei befindet, schreiben Sie sie wie folgt.
props.put("python.path", "C:/・ ・ ・ ・.jar/python");
Wenn Sie wissen, dass es im Python-Ordner vorhanden ist, können Sie es so schreiben.
public static void main(String[] args) {
Properties props = new Properties();
props.put("python.path", getPythonPath());
props.put("python.console.encoding", "UTF-8");
PythonInterpreter.initialize(System.getProperties(), props, new String[0]);
try (PythonInterpreter interp = new PythonInterpreter()) {
interp.exec("import sample");
interp.exec("a = sample.add_numbers(2, 3)");
interp.exec("print(a)");
}
}
private static String getPythonPath() {
try {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
URL root = classLoader.getResource("python");
if ("file".equals(root.getProtocol())) {
Path path = Paths.get(root.toURI());
return path.toString();
} else if ("jar".equals(root.getProtocol())) {
URI jarFileUri = new URI(root.getPath().replaceFirst("!/.*$", ""));
Path path = Paths.get(jarFileUri);
return path.resolve("python").toString();
}
} catch (URISyntaxException e) {
throw new IllegalStateException(e);
}
throw new IllegalStateException("Python-Verzeichnis nicht gefunden");
}
Auf diese Weise können Sie sowohl Flat-Py-Dateien als auch JAR-gepackte Py-Dateien ausführen. Jetzt müssen Sie den Code für die Entwicklung und Bereitstellung nicht mehr neu schreiben.
Schließlich
Zunächst muss ich das 2. System studieren. .. ..
Recommended Posts