转载

超细讲解Java调用python文件的几种方式

恭喜您,这是一个非常有用的话题。在本篇文章中,我们将会深入探讨Java调用Python文件操作的几种方式。下面是完整攻略的具体内容。

1.首选Java调用Python文件的方式:Jython

Jython(Java Python)是一种Python解释器,它使用Java语言编写,可以让Python代码在Java环境下运行。Jython具有明显的优势,可以很好地兼容Python代码中的所有库,因此对于Java和Python开发者来说都是理想的工具。 在使用Jython时,需要在Java环境中下载和安装jython.jar文件,并用于类路径中。接着,你可以用以下的代码调用Python文件。
import org.python.util.PythonInterpreter;

public class TestPython {
   public static void main(String[]args) {
       PythonInterpreter interpreter = new PythonInterpreter();
       interpreter.execfile("path/to/your/python/file.py");
   }
}
首先,我们导入了语言交互器PythonInterpreter。在main函数中,我们创建了一个新的解释器实例,并使用execfile方法执行指定Python文件的代码。

2.其次,使用Java调用Python文件的方式:ProcessBuilder

在这里,我们将介绍另一种方法,可以使用ProcessBuilder类启动和管理外部进程,并调用Python文件。在ProcessBuilder类中,我们可以指定调用的Python文件路径以及需要传递的参数。 例如,以下代码展示了如何使用ProcessBuilder类调用Python文件。
import java.io.IOException;

public class TestPython {
    public static void main(String[] args) {
        ProcessBuilder pb = new ProcessBuilder("python", "path/to/your/python/file.py", "arg1", "arg2");
        try {
            Process p = pb.start();
            p.waitFor();
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}
这种方法的优势在于,它允许我们更灵活地控制和管理调用Python文件的过程,并能够连接多个外部程序作为一个整体流程。

3.最后,还可以使用Java调用Python文件的方式:Runtime类

除ProcessBuilder外,Java还提供了另一种方法,可以使用Runtime类为任何命令行程序创建进程并调用指定的Python文件。
import java.io.IOException;

public class TestPython {
    public static void main(String[] args) {
        try {
            Runtime rt = Runtime.getRuntime();
            rt.exec("<python_path> path/to/your/python/file.py");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
注意,这种方法比其他方法更为基础,代码的可维护性和可读性也会受到限制。

示例

为了更具体地展示这个话题,我们将介绍两个不同的示例。

示例1:Java调用Python文件实现数据处理

假设我们需要用Java调用一个Python脚本,解析CSV数据,并将结果输出到控制台上。以下就是Java调用Python文件实现数据处理的示例程序: 数据文件data.csv
1,2,3
4,5,6
7,8,9
Python代码parse_data.py
import csv
with open('data.csv', 'r') as file:
    csv_reader = csv.reader(file)
    for row in csv_reader:
        print(row)
Java代码TestPython.java
import org.python.util.PythonInterpreter;
import java.io.IOException;

public class TestPython {
    public static void main(String[] args) {
        PythonInterpreter interpreter = new PythonInterpreter();
        interpreter.execfile("path/to/your/parse_data.py");
    }
}
输出
['1', '2', '3']
['4', '5', '6']
['7', '8', '9']
在这个示例中,我们使用Jython方式调用Python文件,解析了本地的data.csv文件,并将结果输出到控制台上。

示例2:Java调用Python文件使用机器学习模型

假设我们需要在Java代码中调用一个已经训练好的机器学习模型(例如scikit-learn),并使用Java中的数据进行预测。以下是Java调用Python文件使用机器学习模型的示例程序: Python代码predict.py
import pickle

# 加载 scikit-learn 模型
model = pickle.load(open('model.pkl', 'rb'))

# 获取特征和对应的值
feature1 = float(input("Feature 1:"))
feature2 = float(input("Feature 2:"))
feature3 = float(input("Feature 3:"))
feature4 = float(input("Feature 4:"))

# 预测结果
result = model.predict([[feature1, feature2, feature3, feature4]])
print(result[0])
Java代码TestPython.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class TestPython {
    public static void main(String[] args) {
        String[] command = {"python", "path/to/your/predict.py"};

        ProcessBuilder pb = new ProcessBuilder(command);
        try {
            Process process = pb.start();

            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

            double feature1 = 0.0, feature2 = 0.0, feature3 = 0.0, feature4 = 0.0;
            List<String> output = new ArrayList<>();

            while (true) {
                // 从 Python 脚本中读取标准输入
                String line = reader.readLine();
                if (line == null || line.isEmpty()) break;

                // 显示 Python 脚本中的提示信息,并输入值
                System.out.print(line.trim() + " ");
                switch (line.trim()) {
                    case "Feature 1:":
                        feature1 = Double.parseDouble(reader.readLine());
                        break;
                    case "Feature 2:":
                        feature2 = Double.parseDouble(reader.readLine());
                        break;
                    case "Feature 3:":
                        feature3 = Double.parseDouble(reader.readLine());
                        break;
                    case "Feature 4:":
                        feature4 = Double.parseDouble(reader.readLine());
                        break;
                }
            }

            // 向 Python 脚本中写入值
            ProcessIO.writeLine(process.getOutputStream(), String.valueOf(feature1));
            ProcessIO.writeLine(process.getOutputStream(), String.valueOf(feature2));
            ProcessIO.writeLine(process.getOutputStream(), String.valueOf(feature3));
            ProcessIO.writeLine(process.getOutputStream(), String.valueOf(feature4));

            // 获取 Python 脚本的输出
            output = ProcessIO.readLines(process.getInputStream());

            // 显示 Python 脚本的输出
            System.out.print("\nResult: ");
            for (String s : output) {
                System.out.println(s);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
输出
Feature 1: 5.6
Feature 2: 2.8
Feature 3: 4.9
Feature 4: 1.9

Result: 1.0
在这个示例中,在Java代码中调用了一个Python脚本和一个Scikit-learn模型,并且可以使用Java数据作为模型的输入,并将Python脚本的输出输出到控制台上。 通过这两个示例,您可以深入理解Java如何执行Python文件,并学习如何轻松地开发和维护Java和Python的混合应用程序。
正文到此结束
Loading...