Verwenden Sie Python aus Java mit Jython. Ich war auch süchtig danach.

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.

Ausführung von Python-Skripten aus Java

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>

Einfache Ausführung von Python-Skripten


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.

Tauschen Sie Variablen mit Python-Skripten aus

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)

Kampfsaiten und Jython

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.

Ich möchte mit str auf Python damit umgehen

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.

Fehler im oberen Bereich

	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? .. .. ..

Laden einer externen Python-Bibliothek (Verzeichnis)

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

Laden einer externen Python-Bibliothek (in jar)

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

Zusammenfassung der Suchtpunkte

Zunächst muss ich das 2. System studieren. .. ..

Recommended Posts

Verwenden Sie Python aus Java mit Jython. Ich war auch süchtig danach.
Ich war süchtig danach, 2020 mit Selen (+ Python) zu kratzen
[IOS] GIF-Animation mit Pythonista3. Ich war süchtig danach.
Ich möchte ein Glas aus Python verwenden
Was ich süchtig nach Python Autorun war
Was ich mit json.dumps in Pythons base64-Codierung süchtig gemacht habe
Ich möchte Twitter mit Python twittern, bin aber süchtig danach
[Einführung in json] Nein, ich war süchtig danach. .. .. ♬
Ich war süchtig danach, eine Python-Venv-Umgebung mit VS Code zu erstellen
Ich möchte Temporäres Verzeichnis mit Python2 verwenden
Ich möchte Ceres Solver aus Python verwenden
Ich habe versucht, Java mit Termux unter Verwendung von Termux Arch zu verwenden, aber es hat nicht funktioniert
Drei Dinge, von denen ich süchtig war, als ich Python und MySQL mit Docker verwendete
Ich konnte AWS-Batch mit Python, Moto verspotten, also werde ich es verlassen
Ein Hinweis, dem ich beim Ausführen von Python mit Visual Studio Code verfallen war
Eine Geschichte, der ich nach der SFTP-Kommunikation mit Python verfallen war
Ich wollte die Python-Bibliothek von MATLAB verwenden
Python: Kann in Lambda wiederholt werden
Wovon ich süchtig war, als ich Python Tornado benutzte
Ich war nüchtern süchtig danach, awscli von einem in crontab registrierten Python 2.7-Skript aus aufzurufen
[Python] Ich möchte die Option -h mit argparse verwenden
Wovon ich süchtig war, als der Processing-Benutzer zu Python wechselte
[Fix] Ich war süchtig nach dem alphanumerischen Urteil über Python-Strings
Python: So verwenden Sie Async mit
Ich habe einen Server mit Python-Socket und SSL erstellt und versucht, über den Browser darauf zuzugreifen
Ich möchte mit Python debuggen
Ich war süchtig nach Multiprocessing + Psycopg2
Eine Geschichte, die ich süchtig danach war, Lambda von AWS Lambda anzurufen.
Ich möchte einen Platzhalter verwenden, den ich mit Python entfernen möchte
Wovon ich süchtig war, als ich ALE in Vim für Python einführte
Ein Hinweis, dem ich beim Erstellen einer Tabelle mit SQL Alchemy verfallen war
Ich las "Das Lernen mit Python von der Einführung bis zur Praxis stärken", Kapitel 1
Python> Verständnis> Zellen> Mir wurde beigebracht, wie man Double Inclusion Notation / itertools verwendet
Ich war süchtig nach falschen Klassenvariablen und Instanzvariablen in Python
Ich las "Das Lernen mit Python von der Einführung bis zur Praxis stärken", Kapitel 2
Mir wurde gesagt, dass ich XML_SetHashSalt nicht finden konnte, als ich versuchte, pip mit Python zu verwenden.
Ich war süchtig danach, keine E-Mail-Adresse von Google mit Django-Allauth-Authentifizierung zu erhalten
Warum ich von Java zu Dart gewechselt bin
Ich wollte ABC160 mit Python lösen
[Einführung in Python] Verwenden wir foreach mit Python
Ich möchte Protokolle mit Python analysieren
Ich war auf dotCloud süchtig nach Flask
Ich möchte mit aws mit Python spielen
Verwenden von C ++ - Funktionen aus Python mit pybind11
Ich wollte ABC172 mit Python lösen
Ich konnte den Thermodrucker "PAPERANG" aus Python (Windows10, Python3.6) drucken.
Ich möchte es mit Python Lambda Django machen, aber ich werde aufhören
Als ich versuchte, Python auszuführen, wurde ich zum Microsoft Store übersprungen
Ich war süchtig danach, Tensorflow auf einer GPU mit dem NVIDIA-Treiber 440 + CUDA 10.2 auszuführen
Eine Geschichte, die ich süchtig danach war, eine Video-URL mit Tweepy zu bekommen
Ich war süchtig danach, Markdown nicht für die lange Beschreibung von Pypi verwenden zu können
Der Dateiname war in Python schlecht und ich war süchtig nach Import
[Python] Ich war eine Stunde lang begeistert, als ich versuchte, die Listeneinschlussnotation zu verwenden
[Python] Es war sehr praktisch, die Python-Klasse für das ROS-Programm zu verwenden.
[Zaif] Ich habe versucht, den Handel mit virtuellen Währungen mit Python zu vereinfachen
Ich habe mit Python mit dem maschinellen Lernen begonnen (ich habe auch angefangen, in Qiita zu posten). Datenvorbereitung
Ich war süchtig danach, Cython mit PyCharm auszuprobieren, also machen Sie sich eine Notiz