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.
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>
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.
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)
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.
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.
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? .. .. ..
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
sys.path.append
du code python.
(Je ne l'ai pas encore essayé dans le pot.)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
Tout d'abord, je dois étudier le 2ème système. .. ..