Java之调用Python代码

简介:   对于一个数据分析方面的工作者来说,最熟悉的语言无疑就是Python了。对于软件开发者而言,Java又是极其重要的工具。那么,一个很自然的问题就是,我们能够在Java中调用Python代码吗?   想要在Java中调用Python代码,有以下两个办法:直接通过Runtime进行调用调用Jython在Java中如果需要调用第三方程序,可以直接通过Runtime实现,这也是最直接最粗暴的做法,粒度更加粗糙,效率较高,需要安装Python软件。

  对于一个数据分析方面的工作者来说,最熟悉的语言无疑就是Python了。对于软件开发者而言,Java又是极其重要的工具。那么,一个很自然的问题就是,我们能够在Java中调用Python代码吗?
  想要在Java中调用Python代码,有以下两个办法:

  • 直接通过Runtime进行调用
  • 调用Jython

在Java中如果需要调用第三方程序,可以直接通过Runtime实现,这也是最直接最粗暴的做法,粒度更加粗糙,效率较高,需要安装Python软件。而Jython是Python语言在Java平台的实现,可以理解为一个由 Java 语言编写的 Python 解释器,因此,不需要安装Python软件。它不仅提供了Python的库,同时也提供了所有的Java类,这就使得其有一个巨大的资源库。Jython可以直接调用Python程序中的指定函数或者对象方法,粒度更加精细。但遗憾的是,Jython运行速度并不理想。
  接下来,我们将分别介绍以上两种调用方法。
  首先是直接通过Runtime调用Python代码。先写个Python代码文件test_argv.py,它位于D盘中,其完整代码如下:

import sys

a = sys.argv[1]

b = sys.argv[2]

print("%s * %s = %s"%(a,b,int(a)*int(b)))

该Python代码接受两个命令行参数,然后输出一个乘法算式。调用的Java代码如下:

package javaCode;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Scanner;

public class TestPython {

    public static void main(String[] args) throws Exception {

        Scanner input = new Scanner(System.in);

        // 在同一行输入两个数字,用空格分开,作为传入Python代码的命令行参数
        System.out.println("Enter two integers(e.g. 12 34): ");
        String integers = input.nextLine();
        String[] numbers = integers.split(" ");

        // 定义传入Python脚本的命令行参数,将参数放入字符串数组里
        String cmds = String.format("python D://test_argv.py %s %s", 
                                    numbers[0], numbers[1]);

        // 执行CMD命令
        System.out.println("\nExecuting python script file now.");
        Process pcs = Runtime.getRuntime().exec(cmds);
        pcs.waitFor();

        // 定义Python脚本的返回值
        String result = null;
        // 获取CMD的返回流
        BufferedInputStream in = new BufferedInputStream(pcs.getInputStream());
        // 字符流转换字节流
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        // 这里也可以输出文本日志

        String lineStr = null;
        while ((lineStr = br.readLine()) != null) {
            result = lineStr;
        }
        // 关闭输入流
        br.close();
        in.close();

        System.out.println(result);

    }
}

从以上代码中,可以发现,我们往Python代码中传入了两个命令行参数(两个整数),通过Java提供的Runtime环境让Python执行程序,最后用Java得到在CMD或shell中的输出流并在Java程序输出,本质上还是Python在处理计算结果。其输出如下图所示:


程序输出结果

  然后我们将演示如何使用Jython来实现类似上述程序的功能。
  Jython的MVN仓库地址为http://mvnrepository.com/artifact/org.python/jython/2.7.1b3, API官方网址为: http://www.jython.org/javadoc/, jar的下载地址为: http://www.jython.org/downloads.html . 下载jython-standalone-2.7.0.jar包,并将其加入到Eclipse的Java Build Path中,如下图:


Java Build Path中加入jython-standalone-2.7.0.jar

Java代码如下:

package javaCode;

import org.python.util.PythonInterpreter;

public class TestPython {
    public static void main(String args[]) {
        PythonInterpreter interpreter = new PythonInterpreter();
        interpreter.exec("import sys ");
        interpreter.exec("a = input('Enter a:')");
        interpreter.exec("b = input('Enter b:')");
        interpreter.exec("print('%s * %s = %s' %(a, b, a*b))");
    }
}

运行以上程序,结果如下图:


运行结果

  至此,我们成功地用以上两种方法在Java中调用了Python代码。
  本次分享到此结束,欢迎大家交流~~

目录
相关文章
|
8天前
|
JavaScript NoSQL Java
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
152 96
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
|
2月前
|
开发框架 数据建模 中间件
Python中的装饰器:简化代码,增强功能
在Python的世界里,装饰器是那些静悄悄的幕后英雄。它们不张扬,却能默默地为函数或类增添强大的功能。本文将带你了解装饰器的魅力所在,从基础概念到实际应用,我们一步步揭开装饰器的神秘面纱。准备好了吗?让我们开始这段简洁而富有启发性的旅程吧!
56 6
|
23天前
|
存储 缓存 Java
Python高性能编程:五种核心优化技术的原理与Python代码
Python在高性能应用场景中常因执行速度不及C、C++等编译型语言而受质疑,但通过合理利用标准库的优化特性,如`__slots__`机制、列表推导式、`@lru_cache`装饰器和生成器等,可以显著提升代码效率。本文详细介绍了这些实用的性能优化技术,帮助开发者在不牺牲代码质量的前提下提高程序性能。实验数据表明,这些优化方法能在内存使用和计算效率方面带来显著改进,适用于大规模数据处理、递归计算等场景。
58 5
Python高性能编程:五种核心优化技术的原理与Python代码
|
2月前
|
Python
课程设计项目之基于Python实现围棋游戏代码
游戏进去默认为九路玩法,当然也可以选择十三路或是十九路玩法 使用pycharam打开项目,pip安装模块并引用,然后运行即可, 代码每行都有详细的注释,可以做课程设计或者毕业设计项目参考
78 33
|
1月前
|
SQL Java 数据库连接
如何在 Java 代码中使用 JSqlParser 解析复杂的 SQL 语句?
大家好,我是 V 哥。JSqlParser 是一个用于解析 SQL 语句的 Java 库,可将 SQL 解析为 Java 对象树,支持多种 SQL 类型(如 `SELECT`、`INSERT` 等)。它适用于 SQL 分析、修改、生成和验证等场景。通过 Maven 或 Gradle 安装后,可以方便地在 Java 代码中使用。
272 11
|
1月前
|
JSON Java 数据挖掘
利用 Java 代码获取淘宝关键字 API 接口
在数字化商业时代,精准把握市场动态与消费者需求是企业成功的关键。淘宝作为中国最大的电商平台之一,其海量数据中蕴含丰富的商业洞察。本文介绍如何通过Java代码高效、合规地获取淘宝关键字API接口数据,帮助商家优化产品布局、制定营销策略。主要内容包括: 1. **淘宝关键字API的价值**:洞察用户需求、优化产品标题与详情、制定营销策略。 2. **获取API接口的步骤**:注册账号、申请权限、搭建Java开发环境、编写调用代码、解析响应数据。 3. **注意事项**:遵守法律法规与平台规则,处理API调用限制。 通过这些步骤,商家可以在激烈的市场竞争中脱颖而出。
|
2月前
|
JavaScript API C#
【Azure Developer】Python代码调用Graph API将外部用户添加到组,结果无效,也无错误信息
根据Graph API文档,在单个请求中将多个成员添加到组时,Python代码示例中的`members@odata.bind`被错误写为`members@odata_bind`,导致用户未成功添加。
52 10
|
2月前
|
安全 Java 编译器
深入理解Java中synchronized三种使用方式:助您写出线程安全的代码
`synchronized` 是 Java 中的关键字,用于实现线程同步,确保多个线程互斥访问共享资源。它通过内置的监视器锁机制,防止多个线程同时执行被 `synchronized` 修饰的方法或代码块。`synchronized` 可以修饰非静态方法、静态方法和代码块,分别锁定实例对象、类对象或指定的对象。其底层原理基于 JVM 的指令和对象的监视器,JDK 1.6 后引入了偏向锁、轻量级锁等优化措施,提高了性能。
77 3
|
2月前
|
数据可视化 Python
以下是一些常用的图表类型及其Python代码示例,使用Matplotlib和Seaborn库。
通过这些思维导图和分析说明表,您可以更直观地理解和选择适合的数据可视化图表类型,帮助更有效地展示和分析数据。
105 8
|
2月前
|
前端开发 Java 测试技术
java日常开发中如何写出优雅的好维护的代码
代码可读性太差,实际是给团队后续开发中埋坑,优化在平时,没有那个团队会说我专门给你一个月来优化之前的代码,所以在日常开发中就要多注意可读性问题,不要写出几天之后自己都看不懂的代码。
78 2

热门文章

最新文章

推荐镜像

更多