首页 > 编程语言 >超细讲解Java调用python文件的几种方式

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

时间:2023-09-18 16:03:26浏览次数:55  
标签:调用 Java String python 超细 Feature Python public

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文件的过程,并能够连接多个外部程序作为一个整体流程。

PDF电子发票识别软件,一键识别电子发票并导入到Excel中!

10大顶级数据挖掘软件!

人工智能的十大作用!

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,String,python,超细,Feature,Python,public
From: https://blog.51cto.com/yangshaoping/7511368

相关文章

  • Python 基本语法
    代码行单行代码每行代码结尾不需要加标点a=123多行换行多行代码,直接换行a=123b=a+1复杂过长的计算、操作可用括号然后缩进换行income=(gross_wages     +taxable_interest     +(dividends-qualified_dividends)     -ira_deduction......
  • python多线程中锁的概念 threading.Lock
    https://blog.csdn.net/qq_21439971/article/details/79356248 python的锁可以独立提取出来12345678mutex  =  threading.Lock()#锁的使用#创建锁mutex  =  threading.Lock()#锁定mutex.acquire([timeout])#释放mutex.release()......
  • 一文读懂Java类型转化:提升编程效率的关键步骤
    java数据类型类型转化Java类型转化是将一个数据类型的值转换为另一个数据类型的值的过程。在Java中,类型转化分为自动类型转化(隐式类型转化)和强制类型转化(显式类型转化)。自动类型转化(隐式类型转化):当两个不同类型的数据进行运算时,Java会自动将高精度的数据类型转换为低精度的数据......
  • python测试用例数据驱动(读取写入excel)
    Python中处理excel数据的模块非常多,比如:xlxd(只读)、xlwd(只写)、openpyxl(可读写)Excel文件和下面的py文件代码一定要在同一个文件夹内,不然需要指定具体的Excel文件路径注意:excel文件为xlsx,不能是xls再转换成xlsx格式的文件,会报错fromopenpyxlimportload_workbookcl......
  • 极速上手Python分布式爬虫
    随着互联网的快速发展,获取大量数据已成为许多项目的核心需求。而Python分布式爬虫是一种高效获取数据的方法。今天,我将个大家分享一下,想要极速上手Python分布式爬虫的一些知识,让你能够迅速掌握这一实用的技术。什么是分布式爬虫?分布式爬虫是一种利用多台机器协同工作的爬虫系统。它......
  • python包离线环境安装与批量安装
    python项目进行落地部署的时候,经常是在离线的服务器或者工控机中进行的。python不同于c类程序,可以直接复制外部依赖项文件夹,这时,python程序如果需要正常运行,需要编写过程中第三方库的支持。首先,在联网环境下,进入cmd终端,使用以下命令下载包python-mpipdownloadtest1test2==......
  • 奇诡的java.lang.NoClassDefFoundError错误
    13:41:05.570[http-nio-8888-exec-40]ERRORo.a.c.c.C.[.[.[.[dispatcherServlet]-[log,175]-Servlet.service()forservlet[dispatcherServlet]incontextwithpath[]threwexception[Filterexecutionthrewanexception]withrootcausejava.lang.NoClassD......
  • Python 压缩图片至指定大小
    @https://www.cnblogs.com/jum-bolg/p/13796595.htmlimportbase64importioimportosfromPILimportImagefromPILimportImageFile#压缩图片文件defcompress_image(outfile,mb=600,quality=85,k=0.9):"""不改变图片尺寸压缩到指定大小:paramoutfile......
  • java 实现大文件上传
    Java实现大文件上传教程一、流程概述在Java中实现大文件上传主要分为以下几个步骤:步骤 操作1.客户端选择文件 用户在界面上选择要上传的大文件2.分片上传 将大文件分割成小文件块,逐个上传到服务器3.服务器合并文件块 服务器接收到上传的文件块后,将其合并成完整的大文件4.完成......
  • 【直接收藏】前端JavaScript面试100问(上)
    1、解释一下什么是闭包?闭包:就是能够读取外层函数内部变量的函数。闭包需要满足三个条件:访问所在作用域;函数嵌套;在所在作用域外被调用。优点:可以重复使用变量,并且不会造成变量污染。缺点:会引起内存泄漏使用闭包的注意点:由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,......