当前位置: 首页 > article >正文

Java中运行Python程序

文章目录

  • Java中运行Python程序
    • 一、引言
    • 二、使用Jython运行Python程序
      • 1、Jython简介
        • 1.1、添加Jython依赖
      • 2、编写Java代码调用Python
    • 三、使用进程间通信运行Python程序
      • 1、原理
      • 2、编写Python脚本
      • 3、编写Java代码
    • 四、使用JNI运行Python程序
      • 1、JNI简介
      • 2、编写JNI代码
      • 3、编写Python脚本
      • 4、在Java中调用JNI库
    • 五、使用示例
    • 六、总结

Java中运行Python程序

在这里插入图片描述

一、引言

在现代软件开发中,Java和Python各自以其独特的优势被广泛应用。Java以其高性能和稳定性成为企业级应用的首选,而Python则以其简洁性和强大的库支持在数据分析、机器学习等领域大放异彩。因此,将Python程序集成到Java环境中,能够充分发挥两种语言的优势,实现更高效、更灵活的开发。

二、使用Jython运行Python程序

1、Jython简介

Jython是一个运行在Java虚拟机上的Python解释器,它允许直接在Java环境中运行Python代码。

1.1、添加Jython依赖

在使用Jython之前,需要在项目的pom.xml文件中添加Jython的依赖:

xml复制

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

2、编写Java代码调用Python

以下是一个简单的示例,展示如何使用Jython运行Python代码:

java复制

import org.python.util.PythonInterpreter;

public class JythonExample {
    public static void main(String[] args) {
        PythonInterpreter interpreter = new PythonInterpreter();
        interpreter.exec("print('Hello from Python')");
    }
}

运行上述Java程序后,将输出:

Hello from Python

三、使用进程间通信运行Python程序

1、原理

Java可以通过创建子进程来运行Python解释器,并通过标准输入输出与Python程序进行通信。

2、编写Python脚本

首先,编写一个简单的Python脚本hello.py

Python复制

print("Hello from Python!")

3、编写Java代码

然后,编写Java代码来运行Python脚本:

java复制

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class ProcessExample {
    public static void main(String[] args) {
        try {
            Process process = Runtime.getRuntime().exec("python hello.py");
            BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
            reader.close();
            process.waitFor();
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}

运行Java程序后,将输出:

Hello from Python!

四、使用JNI运行Python程序

1、JNI简介

JNI(Java Native Interface)允许Java代码调用本地代码(如C/C++)。通过JNI,可以在Java中调用Python代码。

2、编写JNI代码

首先,编写一个C/C++动态链接库来调用Python代码。以下是一个简单的示例:

c复制

#include <jni.h>
#include <Python.h>

JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject obj) {
    Py_Initialize();
    PyObject *pName = PyUnicode_DecodeFSDefault("hello");
    PyObject *pModule = PyImport_Import(pName);
    PyObject *pFunc = PyObject_GetAttrString(pModule, "say_hello");
    PyObject_CallObject(pFunc, NULL);
    Py_Finalize();
}

3、编写Python脚本

编写一个Python脚本hello.py

Python复制

def say_hello():
    print("Hello from Python!")

4、在Java中调用JNI库

在Java中加载JNI库并调用Python代码:

java复制

public class HelloJNI {
    static {
        System.loadLibrary("hello");
    }
    public native void sayHello();
    public static void main(String[] args) {
        new HelloJNI().sayHello();
    }
}

运行Java程序后,将输出:

Hello from Python!

五、使用示例

假设我们有一个Python脚本data_analysis.py,用于进行数据分析:

Python复制

def analyze_data():
    print("Data analysis completed!")

我们可以选择以下方式在Java中运行该脚本:

  • 使用Jython:

    java复制

    import org.python.util.PythonInterpreter;
    public class DataAnalysis {
        public static void main(String[] args) {
            PythonInterpreter interpreter = new PythonInterpreter();
            interpreter.execfile("data_analysis.py");
            interpreter.exec("analyze_data()");
        }
    }
    
  • 使用进程间通信:

    java复制

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class DataAnalysis {
        public static void main(String[] args) {
            try {
                Process process = Runtime.getRuntime().exec("python data_analysis.py");
                BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
                String line;
                while ((line = reader.readLine()) != null) {
                    System.out.println(line);
                }
                reader.close();
                process.waitFor();
            } catch (IOException | InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
  • 使用JNI:

    c复制

    JNIEXPORT void JNICALL Java_DataAnalysis_runAnalysis(JNIEnv *env, jobject obj) {
        Py_Initialize();
        PyObject *pName = PyUnicode_DecodeFSDefault("data_analysis");
        PyObject *pModule = PyImport_Import(pName);
        PyObject *pFunc = PyObject_GetAttrString(pModule, "analyze_data");
        PyObject_CallObject(pFunc, NULL);
        Py_Finalize();
    }
    

    java复制

    public class DataAnalysis {
        static {
            System.loadLibrary("data_analysis");
        }
        public native void runAnalysis();
        public static void main(String[] args) {
            new DataAnalysis().runAnalysis();
        }
    }
    

六、总结

本文介绍了三种在Java中运行Python程序的方法:使用Jython、进程间通信和JNI。每种方法都有其适用场景和优缺点。Jython适合在Java环境中直接运行Python代码,进程间通信适合简单的脚本调用,而JNI则适合需要高性能和复杂交互的场景。开发者可以根据具体需求选择合适的方法。


版权声明:本博客内容为原创,转载请保留原文链接及作者信息。

参考文章

  • Java与Python的无缝对接:探讨Java调用Python的方法与原理
  • 在Java中调用Python脚本:深入解析与实战演练

http://www.kler.cn/a/526090.html

相关文章:

  • QT设置应用程序图标
  • MYSQL 商城系统设计 商品数据表的设计 商品 商品类别 商品选项卡 多表查询
  • JVM栈溢出线上环境排查
  • 【后端】Flask
  • 网站如何正式上线(运维详解)
  • PyTorch API 详细中文文档,基于PyTorch2.5
  • vscode+WSL2(ubuntu22.04)+pytorch+conda+cuda+cudnn安装系列
  • Rust语言进阶之chain用法实例(九十七)
  • 爱快 IK-W35 面板式AP 简单开箱评测和拆解,双频WiFi6 AX3000,2.5G网口
  • 2025年1月22日(网络编程)
  • 数据结构实战之线性表(三)
  • 多目标优化策略之一:非支配排序
  • 前端axios拦截器
  • 短链接项目02---依赖的添加和postman测试
  • .Net / C# 繁体中文 与 简体中文 互相转换, 支持地方特色词汇
  • 【Unity3D】实现横版2D游戏——攀爬绳索(简易版)
  • 力扣【416. 分割等和子集】详细Java题解(背包问题)
  • C++中常用的排序方法之——冒泡排序
  • 《智能家居“孤岛危机”:设备孤立如何拖垮系统优化后腿》
  • 索引02之正确建立和使用索引
  • 572. 另一棵树的子树
  • 1.文件 标准IO库
  • JxBrowser 8.2.2 版本发布啦!
  • momask-codes 部署踩坑笔记
  • 列表(列表是什么)
  • 【Qt】信号和槽简介