Résumé de l'appel des méthodes Python en Java et de l'accès aux enregistrements de fosse

avant-propos

Récemment, j'ai besoin d'appeler des scripts Python via Java dans un projet. J'ai parcouru de nombreux blogs sur Internet et j'ai rencontré de nombreux pièges tout au long du processus de fonctionnement. Par conséquent, cet article fait un résumé de l'appel de Python en Java et des problèmes rencontré.

méthode d'appel

Appel via Runtime

Les exemples sont les suivants :

public class InvokeByRuntime {
    
    
	/**
	 * @param args
	 * @throws IOException 
	 * @throws InterruptedException 
	 */
	public static void main(String[] args) throws IOExceptionInterruptedException {
    
    
		String exe = "python";
		String command = "D:\\calculator_simple.py";
		String num1 = "1";
		String num2 = "2";
		String[] cmdArr = new String[] {
    
    exe, command, num1, num2};
		Process process = Runtime.getRuntime().exec(cmdArr);
		InputStream is = process.getInputStream();
		DataInputStream dis = new DataInputStream(is);
		String str = dis.readLine();
		process.waitFor();
		System.out.println(str);
	}
}

caculator_simple.py:

# coding=utf-8
from sys import argv

num1 = argv[1]
num2 = argv[2]
sum = int(num1) + int(num2)
print sum

sortir:

3

Cette méthode a le même effet que l'exécution directe du programme Python. Python peut lire les paramètres passés par Java, mais l'inconvénient est que le résultat ne peut pas être renvoyé via l'instruction return en Python et que la valeur de retour ne peut être écrite que dans le standard. flux de sortie, puis utilisé Java lit la valeur de sortie de Python

Appelé par Jython

Introduisez les dépendances dans le projet maven, la dernière version est utilisée ici

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

pas de paramètre pas de valeur de retour

exemple:

package com.poas.utils;
import org.python.util.PythonInterpreter;

public class PythonTest {
    
    
    public static void main(String[] args) {
    
    
        PythonInterpreter interpreter = new PythonInterpreter();
        //这里用的是相对路径,注意区分
        interpreter.execfile("core/src/main/java/com/poas/utils/plus.py");
      
      	interpreter.cleanup();
        interpreter.close();
    }
}

plus.py:

a = 1
b = 2
print(a + b)

sortir

3

Il y a des paramètres et des valeurs de retour

exemple:

package com.poas.utils;

import org.python.core.PyFunction;
import org.python.core.PyInteger;
import org.python.core.PyObject;
import org.python.util.PythonInterpreter;

public class PythonTest {
    
    
    public static void main(String[] args) {
    
    
        PythonInterpreter interpreter = new PythonInterpreter();
        //我在这里使用相对路径,注意区分
        interpreter.execfile("core/src/main/java/com/poas/utils/plus.py");

        // 第一个参数为期望获得的函数(变量)的名字,第二个参数为期望返回的对象类型
        PyFunction pyFunction = interpreter.get("add", PyFunction.class);
        int a = 5, b = 10;
        //调用函数,如果函数需要参数,在Java中必须先将参数转化为对应的“Python类型”
        PyObject pyobj = pyFunction.__call__(new PyInteger(a), new PyInteger(b));
        System.out.println("the anwser is: " + pyobj);
      
      	interpreter.cleanup();
        interpreter.close();
    }
}

plus.py:

def add(a,b):
    return a+b

Après exécution, le résultat est 15

Record de piétinement

La plupart des blogs sur Internet ont atteint la partie ci-dessus, mais j'ai également rencontré les problèmes suivants dans la pratique

报错 : Caractère non-ASCII dans le fichier xxx, mais aucun encodage déclaré

La raison en est qu'il y a du chinois dans le fichier python, qui ne peut pas être reconnu, même s'il s'agit d'un commentaire.

dans le fichier pythonpremière rangéeAjoutez le contenu suivant, le problème est résolu

# -*- coding: utf-8 -*-

Remarque : Impossible de créer un PyString avec une valeur autre qu'un octet

La version de jython que j'ai utilisée au début était la 2.7.0, et cette erreur a été signalée lors du passage de chaînes en Java : Impossible de créer un PyString avec une valeur autre qu'un octet ; j'ai vérifié sur Internet et j'ai dit qu'il s'agissait d'un problème de version, j'ai donc mis à jour le version vers 2.7.2, le problème est résolu

Erreur : ImportError : aucun module nommé xxx

J'ai référencé une bibliothèque tierce dans mon fichier python et j'ai donc eu cette erreur

Fichier Java :

public class PythonTest {
    
    
    public static void main(String[] args) {
    
    
        PythonInterpreter interpreter = new PythonInterpreter();       
        interpreter.execfile("core/src/main/java/com/poas/utils/hello.py");        
        PyFunction pyFunction = interpreter.get("hello", PyFunction.class);        
        PyString str = Py.newString("hello world!");
        PyObject pyobj = pyFunction.__call__(str);
        System.out.println(pyobj);
      
      	interpreter.cleanup();
        interpreter.close();
    }
}

fichier python :

import requests #此处这个包没有实际作用,只是为了复现报错
def hello(str) :
    print(str)
    return str

Erreur:

ImportError: No module named requests

Vérifiez d'abord si la bibliothèque tierce correspondante est installée. Après succès dans l'environnement python, cela signifie que le module correspondant a été installé ; après recherche sur Internet, il s'avère qu'il doit être configuréchemin du système Python, le code s'affiche comme ci-dessous :

public class PythonTest {
    
    
    public static void main(String[] args) {
    
    
		// 配置python的系统路径
        System.setProperty("python.home", "/usr/bin/python2.7");

        PythonInterpreter interpreter = new PythonInterpreter();
        interpreter.execfile("core/src/main/java/com/poas/utils/hello.py");        
        PyFunction pyFunction = interpreter.get("hello", PyFunction.class);        
        PyString str = Py.newString("hello world!");
        PyObject pyobj = pyFunction.__call__(str);
        System.out.println(pyobj);
      
      	interpreter.cleanup();
        interpreter.close();
    }
}

Une fois la configuration terminée, l'erreur est toujours signalée

Continuez à vérifier les informations, en plus de la configuration ci-dessus, mais aussi leLe chemin de la bibliothèque tierce référencéeAjoutez à la variable d'environnement système, le code est le suivant :

public class PythonTest {
    
    
    public static void main(String[] args) {
    
    
        // 配置python的系统路径
        System.setProperty("python.home", "/usr/bin/python2.7");

        PythonInterpreter interpreter = new PythonInterpreter();
        // 添加第三方库的路径
        PySystemState sys = interpreter.getSystemState();
        sys.path.add("/Users/xxx/Library/Python/2.7/lib/python/site-packages");

        interpreter.execfile("core/src/main/java/com/poas/utils/hello.py");
        PyFunction pyFunction = interpreter.get("hello", PyFunction.class);
        PyString str = Py.newString("hello world!");
        PyObject pyobj = pyFunction.__call__(str);
        System.out.println(pyobj);
        interpreter.cleanup();
        interpreter.close();
    }
}

problème résolu

les références:

Appeler Python en Java
[Java] Quatre façons d'appeler Python en utilisant Java

Je suppose que tu aimes

Origine blog.csdn.net/wzc3614/article/details/128666187
conseillé
Classement