Java调用python代码的五种方式

这篇具有很好参考价值的文章主要介绍了Java调用python代码的五种方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

你还在纠结怎么样在Java中调用python吗?我们在实际工程项目问题中,经常会碰到不同语言代码之间互调的问题,比如此处的Java调用python(常见Java调用python写的处理模型来完成数据处理等)。


让我们来看看具体怎么操作吧!

1. 无参数调用

说明: Java调用不带参数的python代码执行
样例代码如下:

try {
	String exe = "python解释器所处的绝对路径";
	String py = "python代码文件绝对地址";
	Process process = Runtime.getRuntime().exec(exe + " " + py);
	//获取结果的同时设置输入流编码格式"gb2312"
	InputStreamReader isr = new InputStreamReader(process.getInputStream(),"gb2312");
	LineNumberReader input = new LineNumberReader(isr);
	String result = "";
	result = input.readLine();
	System.out.println(result);
	input.close();
	isr.close();
	process.waitFor();
} catch (InterruptedException | IOException e) {
	System.out.println("调用python脚本并读取结果时出错:" + e.getMessage());
}

2. 带参数调用

带参调用可以将命令和参数写入String数组,然后作为执行参数执行。
基本语句如下:

String exe = "python解释器所处的绝对路径";
String py = "python代码文件绝对地址";
String pram = "单个传递参数,若参数为基本类型,转化为String;若为数组等类型,也是将其转换为String型";
String [] args = new String[] {exe, py, pram...};
Process process = Runtime.getRuntime().exec(args);

2.1. 单行返回值

说明: Java调用不带参数的python代码执行
样例代码如下:

try {
	String exe = "python解释器所处的绝对路径";
	String py = "python代码文件绝对地址";
	String pram = "单个传递参数,若参数为基本类型,转化为String;若为数组等类型,也是将其转换为String型";
	String [] args = new String[] {exe, py, pram...};
	Process process = Runtime.getRuntime().exec(args);
	//获取结果的同时设置输入流编码格式"gb2312"
	InputStreamReader isr = new InputStreamReader(process.getInputStream(),"gb2312");
	LineNumberReader input = new LineNumberReader(isr);
	String result = "";
	result = input.readLine();
	System.out.println(result);
	input.close();
	isr.close();
	process.waitFor();
} catch (InterruptedException | IOException e) {
	System.out.println("调用python脚本并读取结果时出错:" + e.getMessage());
}

2.2. 多行返回值

说明: Java调用不带参数的python代码执行
样例代码如下:

try {
	String exe = "python解释器所处的绝对路径";
	String py = "python代码文件绝对地址";
	String pram = "单个传递参数,若参数为基本类型,转化为String;若为数组等类型,也是将其转换为String型";
	String [] args = new String[] {exe, py, pram...};
	ProcessBuilder builder = new ProcessBuilder(args);
    Process process = builder.start();
    BufferedReader success = new BufferedReader(new InputStreamReader(process.getInputStream(), "GB2312"));//获取字符输入流对象
    BufferedReader error = new BufferedReader(new InputStreamReader(process.getErrorStream(), "GB2312"));//获取错误信息的字符输入流对象
    String line = null;
    List<String> success_result = new ArrayList<>();
    List<String> error_result = new ArrayList<>();
    //记录输出结果
    while ((line = success.readLine()) != null) {
        success_result.add(line);
    }
    //记录错误信息
    while ((line = error.readLine()) != null) {
        error_result.add(line);
    }
    success.close();
    error.close();
    process.waitFor();

    System.out.println(success_result);
    System.out.println(error_result);
} catch (InterruptedException | IOException e) {
	System.out.println("调用python脚本并读取结果时出错:" + e.getMessage());
}

3. Java中直接执行python语句

注意: 此方法在使用之前需要导入依赖环境,如在maven中导入如下依赖:

<dependency>
    <groupId>org.python</groupId>
    <artifactId>jython-standalone</artifactId>
    <!--python版本在这里指定(2.x或3.x等)-->
    <version>3.7.0</version>	
</dependency>

调用语句如下:

import org.python.util.PythonInterpreter
public class JavaRunPython {
    public static void main(String[] args) {
    	//调用python的解释器
        PythonInterpreter interpreter = new PythonInterpreter();
        //执行Python语句
        interpreter.exec("str = 'hello world!'; ");
        interpreter.exec("print(str);");
    }
}

4. 通过PythonInterpreter直接调用python脚本

注意: 此方法也需要导入1.3中依赖
Java调用代码如下:

import org.python.util.PythonInterpreter;
public class JavaPythonFile {
    public static void main(String[] args) {
        PythonInterpreter interpreter = new PythonInterpreter();
        //我在这里使用相对路径,注意区分
        interpreter.execfile("D:/code/test.py");
    }
}

test.py举例如下:

a = 1
b = 2
print(a +)

5. Java通过调用bat文件间接调用python

hello.bat测试代码如下:

echo hello world!
D:
cd D:\code\
start python test.py
pause

Java调用代码如下:

try {
	StringBuilder sb = new StringBuilder();
	String batPath = "D:/hello.bat";
	Process process = Runtime.getRuntime().exec(batPath);
	InputStream in = process.getInputStream();
	BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in));
	String line;
	while ((line = bufferedReader.readLine()) != null) {
		sb.append(line + "\n");
	}
	in.close();
	try {
		process.waitFor();
	} catch (InterruptedException e) {
		System.out.println(e);
	}
} catch (IOException e) {
	System.out.println(e);
}

如果大家有好的方法,欢迎交流评论!文章来源地址https://www.toymoban.com/news/detail-488245.html

到了这里,关于Java调用python代码的五种方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java VS Go 还在纠结怎么选吗,(资深后端4000字带你深度对比)

    今天我们来聊一下Go 和Java,本篇文章主要是想给对后台开发的初学者和有意向选择Go语言的有经验的程序员一些建议,希望能帮助各位自上而下的来了解一下Java和Go的全貌。 作为一个多年的Java后端开发,用的时间久了就会发现Java语言一些问题,所谓婚前风花雪月,婚后柴米

    2024年02月04日
    浏览(29)
  • Java单例模式的五种实现方式 懒汉式 饿汉式 双重校验锁 静态变量 静态内部类 枚举实现单例模式等

    Java单例模式是一种设计模式,用于确保一个类只有一个实例,并提供全局访问点以获取该实例。它通常用于需要共享资源或控制某些共享状态的情况下。 懒汉式:在类加载的时候就创建对象,要再调用方法时才创建对象,减少内存开销。 饿汉式:再类加载的时候就实例化对

    2024年04月27日
    浏览(27)
  • 多线程的五种“打开”方式

    线程(Thread)是计算机科学中的一个基本概念,它是进程(Process)中的一个执行单元,负责执行程序的指令序列。 线程是操作系统能够进行调度和执行的最小单位。 在多任务操作系统中,多个线程可以在同一个进程内并发执行,共享进程的资源。 { 假设你正在厨房中准备晚

    2024年02月10日
    浏览(27)
  • PHP的五种运行方式

    PHP的五种运行方式: 1、命令行方式:通过在 命令行终端中输入 php 命令 ,可以执行PHP脚本文件。这种方式常用于执行独立的PHP脚本,比如执行一些批处理任务、定时任务等。 优点:灵活方便,可用于执行独立的PHP脚本,适合批处理任务和定时任务。 缺点:需要手动在命令

    2024年02月05日
    浏览(38)
  • List集合的五种遍历方式

    目录 一、List五种遍历方式  1、普通for遍历 2、 增强for遍历  3、Lambda表达式  4、迭代器遍历  5、列表迭代器 方法 说明 迭代器遍历 在遍历的过程中需要删除元素,请使用迭代器。 列表迭代器 在遍历的过程中需要添加元素,请使用列表迭代器。 增强for遍历 仅仅想遍历,那

    2024年02月10日
    浏览(34)
  • 微前端:qiankun的五种通信方式

    今天盘点一下 qiankun 父子应用的通信方式都有哪些,我发现了 5 种。 1、localStorage/sessionStorage 2、通过路由参数共享 3、官方提供的 props 4、官方提供的 actions 5、使用vuex或redux管理状态,通过shared分享 接下来我们一个一个进行说明 有人说这个方案必须主应用和子应用是同一个

    2024年03月21日
    浏览(36)
  • springboot实现跨域的五种方式

    出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。 同源策略 同源策略会

    2024年02月05日
    浏览(35)
  • Vue路由跳转的五种方式

    路由跳转有两种形式:声明式导航、编程式导航 1. router-link 声明式 prop= :to=“…” 相当与 router.push(…) router-link中链接如果是’ / \\\'开始,就是从根路由开始 如果开始不带 ’ / \\\',则是从当前路由开始 例子 2. this.$router.push() 可追溯 编程式 router.push(…)//该方法的参数可以是一个

    2024年02月05日
    浏览(27)
  • 微信小程序传参的五种方式

    大家好,今天和大家分享一下微信小程序页面之间传参的五种方式,这个的话也是有人问了我一嘴,然后现在我和大家分享一下。 使用GPT搜索的话给我的答案是纯文字的描述,但是大致就是这样: URL参数传递:可以将参数直接拼接在页面的URL中,在打开目标页面时,通过获

    2024年02月06日
    浏览(29)
  • javaee spring aop 的五种通知方式

    2024年02月10日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包