在java中调用python脚本的三种方法

 更新时间:2023年09月20日 10:47:16   作者:努力提升的码农  
实际工程项目中可能会用到Java和python两种语言结合进行,这样就会涉及到一个问题,就是怎么用Java程序来调用已经写好的python脚本呢,这篇文章主要给大家介绍了关于在java中调用python脚本的三种方法,需要的朋友可以参考下

前言

推荐使用第三种方法,因为只有第三种方法使用Runtime.getRuntime()才能执行含有第三方库(numpy,matlab,pandas等库)的python脚本。

方法一:在java程序中执行Python语句

1.首先在maven中添加依赖

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

2.使用Jpython中的PythonInterpreter执行Python语句

public class Tool{
    public static void main(String [] args){
        PythonInterpreter interpreter = new PythonInterpreter();
		interpreter.exec("print("This is a JPython text")");
        interpreter.exec("print(2+3)");
    }
}

方法二:java执行python脚本(不支持第三方库)

1.首先在maven中添加依赖(也是依赖Jpython包)

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

2.创建一个Python脚本

#当我们的Python脚本中有汉字的时候,需要在脚本的第一行写coding = utf-8 来告诉编译器编码方式是什么
# -*- coding: UTF-8 -*-
a = 'This is a test'
print(a)

3.在java中执行python脚本

public class Tool{
    public static void main(String [] args){
        PythonInterpreter interpreter = new PythonInterpreter();
		interpreter.execfile("./text.py");//放脚本的位置
		interpreter.cleanup();
		interpreter.close();
    }
}

方法三:使用Runtime.getRuntime()执行Python脚本

1.不需要传递参数的例子

先创建一个简单的调用第三方库的Python脚本

import numpy as np
a = np.arange(10)
print(a)

然后使用 Runtime.getRuntime() 方法执行python脚本

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Tool {
    public static void main(String[] args) {
        try {
            Process proc = Runtime.getRuntime().exec("test.py");//执行脚本
            //用输入输出流来截取结果
            BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
            String line = null;
            while((line = reader.readLine()) != null){
                System.out.println(line);
            }
            reader.close();
            proc.waitFor();
        } catch (IOException e) {
             throw new RuntimeException(e);
        } catch (InterruptedException e) {
             throw new RuntimeException(e);
        } 
    }
}

2.需要传递参数的例子

import sys
def sum(a, b, c):
	return a+b+c
if __name__ == "__main__":	
	a=(int(sys.argv[1]))
	b=(int(sys.argv[2]))
	c=(int(sys.argv[3]))
	s=sum(a,b,c)
	print("finish!!!")
	print(s)

sys.argv用于获取参数url1,url2,乃至更多,sys.argv[0]代表python程序名

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
public class Tool {
    public static void main(String [] args) {
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
		int b = scanner.nextInt();
		int c = scanner.nextInt();
        try {
            String[] my_args =new String[] {"python","test.py",String.valueOf(a),String.valueOf(b),String.valueOf(c)};
            Process proc =  Runtime.getRuntime().exec(my_args);//执行脚本
            BufferedReader reader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
            String line = null;
            while((line = reader.readLine()) != null){
                System.out.println(line);
            }
            reader.close();
            proc.waitFor();
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

my_args数组里面存放的参数{“python”,“test.py”,String.valueOf(a),String.valueOf(b),String.valueOf©},第一个是固定的就写’python‘,第二个是我们要执行的python脚本的位置(注意路径),后面的是我们要传递的参数也就是url1,url2等等(和Python脚本所接收的内容互相对应)

这种方式我们需要使用输入流输出流BufferedReader来截取结果

总结 

到此这篇关于在java中调用python脚本的三种方法的文章就介绍到这了,更多相关java调用python脚本内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot 整合mybatis+mybatis-plus的详细步骤

    SpringBoot 整合mybatis+mybatis-plus的详细步骤

    这篇文章主要介绍了SpringBoot 整合mybatis+mybatis-plus的步骤,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • 从Spring源码解析事务失效的原因

    从Spring源码解析事务失效的原因

    今天带大家学习Spring的相关知识,文章围绕着Spring事务失效的原因等相关知识展开,文中有非常详细的介绍及图文示例,需要的朋友可以参考下
    2021-06-06
  • 20秒教你学会java List函数排序操作示例

    20秒教你学会java List函数排序操作示例

    这篇文章主要为大家介绍了20秒教你学会List函数排序操作示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Hutool Java工具类库_ExcelUtil的使用

    Hutool Java工具类库_ExcelUtil的使用

    这篇文章主要介绍了Hutool Java工具类库_ExcelUtil的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java中创建对象的5种方式总结

    Java中创建对象的5种方式总结

    本篇文章主要介绍了Java中创建对象的5种方式总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • Java设计模式常用原则解析

    Java设计模式常用原则解析

    这篇文章主要介绍了Java设计模式常用原则解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • 自定义log4j.properties的加载位置方式

    自定义log4j.properties的加载位置方式

    这篇文章主要介绍了自定义log4j.properties的加载位置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 浅谈java日志格式化

    浅谈java日志格式化

    不管我们使用何种语言开发,一旦程序发生异常,日志是一个很重要的数据。但是并不是意味着打印的日志越多越好,我们需要的是有用的日志。下面小编来和大家一起学习以下知识
    2019-05-05
  • SpringCloud Stream消息驱动实例详解

    SpringCloud Stream消息驱动实例详解

    这篇文章主要介绍了SpringCloud Stream消息驱动的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • SpringBoot热部署Springloaded实现过程解析

    SpringBoot热部署Springloaded实现过程解析

    这篇文章主要介绍了SpringBoot热部署Springloaded实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03

最新评论