Utilisez Python de Java avec Jython. J'étais aussi accro.

Jython vous permet d'exécuter des scripts Python sur une JVM. Y a-t-il quelqu'un qui l'utilise? Vous pourriez penser, mais c'est moi. Je suis ici.

Jython

Auteur http://www.jython.org/ wikipedia https://ja.wikipedia.org/wiki/Jython

J'écrirai comment utiliser (code Java) et les points addictifs.

Exécution de script Python à partir de Java

Quand je l'ai googlé, j'ai eu l'impression qu'il existe de nombreuses façons de l'installer et de l'utiliser à partir de la ligne de commande, mais cette fois, je vais l'exécuter à partir du code Java.

Premier maven pom.xml

pom.xml


		<dependency>
			<groupId>org.python</groupId>
			<artifactId>jython-standalone</artifactId>
			<version>2.7.0</version>
		</dependency>

Exécution de script Python simple


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)");
		}
	}

Résultat (console)

3

Je n'étais pas sûr de ce qu'était exactement python.console.encoding, mais j'ai eu une erreur s'il n'était pas là, donc je l'ai écrit quand je l'ai cherché sur Google.

Échangez des variables avec des scripts Python

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);//Remplacez 10 par x
			interp.exec("a = x + 2");

			PyObject a = interp.get("a");//Obtenez le résultat d'un

			System.out.println(a);
			System.out.println(a.getClass());
		}
	}

résultat

12
class org.python.core.PyInteger

Il existe différentes classes d'implémentation de PyObject, et vous pouvez les définir et les amener à échanger du code Java et du code Python.

PyInteger si vous voulez passer int, PyString si vous voulez passer str ... Je pense que les Japonais en sont accro ici. Voir suivant.

	PyString s = new PyString("AIUEO");

Quand j'essaye de générer une PyString avec la chaîne "" AIUEO "`, cela ressemble à ceci.

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)
à ....main(・ ・ ・ ・)

Gununu. La première chose à comprendre est que Jython prend en charge Python 2. Le code Python3 ne fonctionne pas. (J'étudiais uniquement Python3 donc j'ai été déçu)

Combattre les chaînes et Jython

Python2 devait être unicode. Alors

	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

J'ai pu le faire.

Je veux le gérer avec str sur Python

Encodez-le sur un script Python et gérez-le avec 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

Je m'y attendais d'une manière ou d'une autre. Récrire

	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

Ce n'était pas grave si je le décodais en unicode avant de prendre la variable.

Erreur en haut

	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());
		}
	}

Où attendre le résultat ʻ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

Quand je suis plus haut sur Python, cela semble être une erreur car «new PyString ()» est terminé et des caractères multi-octets sont inclus. peut être. Il semble qu'il n'y ait aucune solution de contournement ici autre que l'écriture du code avec soin. Il est préférable d'utiliser unicode au lieu de str. (Veuillez préciser s'il existe une méthode) Cependant, il ne peut pas être aidé s'il est utilisé dans une bibliothèque Python externe. Merveille? .. .. ..

Chargement de la bibliothèque Python externe (répertoire)

Créez le fichier py suivant dans un répertoire

sample.py


# coding:utf-8
def add_numbers(a, b):
	return a + b

Chargez et exécutez ceci

	public static void main(String[] args) {
		Properties props = new Properties();

		props.put("python.path", "[Exemple ci-dessus.Répertoire avec 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.import py
			interp.exec("a = sample.add_numbers(2, 3)");
			interp.exec("print(a)");
		}
	}
5

Définissez le répertoire sur python.path. S'il y en a plusieurs, il semble que cela puisse être géré en les reliant avec un délimiteur. (Windows ;) http://www.jython.org/archive/22/userfaq.html#my-modules-can-not-be-found-when-imported-from-an-embedded-application

Chargement de la bibliothèque Python externe (dans jar)

Vous pouvez également exécuter le fichier py dans le fichier jar.

Comment spécifier Spécifiez [Path.jar with Jar] \ [nom de dossier dans jar avec py file].

S'il y a un fichier py dans un dossier appelé python dans le jar, écrivez-le comme ceci.

props.put("python.path", "C:/・ ・ ・ ・.jar/python");

Si vous savez qu'il existe dans le dossier python, vous pouvez l'écrire comme ceci.

	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("répertoire python introuvable");
	}

Cela vous permet d'exécuter à la fois des fichiers py plats et des fichiers py compressés en jar. Vous n'avez plus besoin de réécrire le code pour le développement et le déploiement.


finalement

Résumé des points addictifs

Tout d'abord, je dois étudier le 2ème système. .. ..

Recommended Posts

Utilisez Python de Java avec Jython. J'étais aussi accro.
J'étais accro au grattage avec Selenium (+ Python) en 2020
[IOS] Animation GIF avec Pythonista3. J'en étais accro.
Je veux utiliser jar de python
Ce que j'étais accro à Python autorun
Ce à quoi j'étais accro avec json.dumps dans l'encodage base64 de Python
Je veux tweeter Twitter avec Python, mais j'y suis accro
[Introduction à json] Non, j'en étais accro. .. .. ♬
J'étais accro à la création d'un environnement Python venv avec VS Code
Je souhaite utiliser le répertoire temporaire avec Python2
Je veux utiliser le solveur ceres de python
J'ai essayé d'utiliser Java avec Termux en utilisant Termux Arch, mais cela n'a pas fonctionné
Trois choses auxquelles j'étais accro lors de l'utilisation de Python et MySQL avec Docker
J'ai pu me moquer d'AWS-Batch avec python, moto, donc je vais le laisser
Une note à laquelle j'étais accro lors de l'exécution de Python avec Visual Studio Code
Une histoire à laquelle j'étais accro après la communication SFTP avec python
Je voulais utiliser la bibliothèque Python de MATLAB
Python: peut être répété en lambda
Ce à quoi j'étais accro lors de l'utilisation de Python tornado
J'étais sobrement accro à appeler awscli à partir d'un script Python 2.7 enregistré dans crontab
[Python] Je souhaite utiliser l'option -h avec argparse
Ce à quoi j'étais accro lorsque l'utilisateur de traitement est passé à Python
[Réparer] J'étais accro au jugement alphanumérique des chaînes Python
Python: comment utiliser async avec
J'ai créé un serveur avec socket Python et ssl et j'ai essayé d'y accéder depuis le navigateur
Je veux déboguer avec Python
J'étais accro au multitraitement + psycopg2
Une histoire à laquelle j'étais accro à appeler Lambda depuis AWS Lambda.
Je souhaite utiliser un caractère générique que je souhaite décortiquer avec Python remove
Ce à quoi j'étais accro en présentant ALE à Vim pour Python
Une note à laquelle j'étais accro lors de la création d'une table avec SQL Alchemy
J'ai lu "Renforcer l'apprentissage avec Python de l'introduction à la pratique" Chapitre 1
Python> Compréhension> Cellules> On m'a appris à utiliser la notation à double inclusion / itertools
J'étais accro aux variables de classe et aux variables d'instance erronées en Python
J'ai lu "Renforcer l'apprentissage avec Python de l'introduction à la pratique" Chapitre 2
On m'a dit que je ne pouvais pas trouver XML_SetHashSalt lorsque j'ai essayé d'utiliser pip avec python.
J'étais accro à ne pas pouvoir obtenir une adresse e-mail de Google avec l'authentification django-allauth
Pourquoi je suis passé de Java à Dart
Je voulais résoudre ABC160 avec Python
[Introduction à Python] Utilisons foreach avec Python
Je veux analyser les journaux avec Python
J'étais accro à Flask sur dotCloud
Je veux jouer avec aws avec python
Utilisation des fonctions C ++ de python avec pybind11
Je voulais résoudre ABC172 avec Python
J'ai pu imprimer l'imprimante thermique "PAPERANG" depuis Python (Windows10, Python3.6)
Je veux le faire avec Python lambda Django, mais je vais m'arrêter
Lorsque j'ai essayé d'exécuter Python, j'ai été ignoré dans le Microsoft Store
J'étais accro à l'exécution de tensorflow sur GPU avec le pilote NVIDIA 440 + CUDA 10.2
Une histoire à laquelle j'étais accro à essayer d'obtenir une URL de vidéo avec tweepy
J'étais accro à ne pas pouvoir utiliser Markdown pour la description longue de pypi
Le nom du fichier était mauvais en Python et j'étais accro à l'importation
[Python] J'ai été accro pendant une heure à essayer d'utiliser la notation d'inclusion de liste
[Python] Il était très pratique d'utiliser la classe Python pour le programme ROS.
[Zaif] J'ai essayé de faciliter le commerce de devises virtuelles avec Python
J'ai commencé l'apprentissage automatique avec Python (j'ai également commencé à publier sur Qiita) Préparation des données
J'étais accro à essayer Cython avec PyCharm, alors prenez note