java调用python脚本

java调用python脚本

1.需求背景

         在开发过程中,面临的使用java调用python的脚本程序,在此背景下就需要程序能够调用python脚本。调用python脚本有以下几种情况,不带参数调用python脚本,动态传参数调用python脚本,调用python脚本中的某个方法,以下将讲解如何实现上述需求。

         代码在windows系统上运行,需要提前安装python的运行环境,linux系统上默认安装了python2的运行环境。

2.不带参数调用python脚本

2.1编写测试python脚本

D:\python\pycharm\pycharmProjects\java-python\Test01\Python01.py

def print_str():

    print("python程序已经执行")

if __name__ == '__main__':

    print_str()

2.2编写java程序

a.导入maven的jar包

<!-- https://mvnrepository.com/artifact/org.python/jython -->

<dependency>

    <groupId>org.python</groupId>

    <artifactId>jython</artifactId>

    <version>2.7.1b3</version>

</dependency>

b.编写java代码

import org.python.util.PythonInterpreter;

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.util.Properties;





public class Java01 {

    public static void main(String[] args) {



        System.out.println("-----方式一-----");

        Properties props = new Properties();

        //python的Lib库的位置

        //props.put("python.home", "C:\\Program Files\\Anaconda3\\Lib");

        props.put("python.console.encoding", "UTF-8");

        props.put("python.security.respectJavaAccessibility", "false");

        //注意:如果没有这一条会有Exception in thread "main" ImportError: Cannot import site module and its dependencies: No module named site报错

        props.put("python.import.site", "false");

        Properties preprops = System.getProperties();

        //python解释器

        PythonInterpreter.initialize(preprops, props, new String[0]);

        PythonInterpreter interpreter = new PythonInterpreter();

        //执行python脚本,并且直接把python脚本执行的输出打印到控制太上

        interpreter.execfile("D:\\python\\pycharm\\pycharmProjects\\java-python\\Test01\\Python01.py");

        interpreter.close();



        System.out.println("-----方式二-----");

         try {

            //设置命令行传入参数

            String[] parameters = new String[] { "python", "D:\\python\\pycharm\\pycharmProjects\\java-python\\Test01\\Python01.py"};

            Process pr = Runtime.getRuntime().exec(parameters);

            //获取程序执行在控制台打印的内容

            BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream(),"gbk"));

            String line;

            while ((line = in.readLine()) != null) {

                System.out.println(line);

            }

            in.close();

            pr.waitFor();

        } catch (Exception e) {

            e.printStackTrace();

        }



    }

}

c.运行结果

3.动态传参数调用python脚本

3.1编写测试python脚本

D:\python\pycharm\pycharmProjects\java-python\Test01\Python02.py

import sys





def adder(a, b):

    c = int(a) + int(b)

    return (c)



if __name__ == '__main__':

    print("python程序已经执行")

    print(adder(sys.argv[1], sys.argv[2]))

3.2编写java程序

a.导入maven的jar包

<!-- https://mvnrepository.com/artifact/org.python/jython -->

<dependency>

    <groupId>org.python</groupId>

    <artifactId>jython</artifactId>

    <version>2.7.1b3</version>

</dependency>

b.编写java代码

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;



public class Java02 {



    public static void main(String[] args) {

        try {

            //设置命令行传入参数

            String[] parameters = new String[] { "python", "D:\\python\\pycharm\\pycharmProjects\\java-python\\Test01\\Python02.py", "20", "30"};

            Process pr = Runtime.getRuntime().exec(parameters);

            //遍历得到python在执行的时候在控制台上输出的内容

            BufferedReader in = new BufferedReader(new InputStreamReader(pr.getInputStream(),"gbk"));

            String line;

            while ((line = in.readLine()) != null) {

                System.out.println(line);

            }

            in.close();

            pr.waitFor();

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

}

c.输出结果

4.调用python脚本中的某个方法

4.1编写测试python脚本

D:\python\pycharm\pycharmProjects\java-python\Test01\Python03.py

def adder(a, b):

    return (a + b)



if __name__ == '__main__':

    print("我是python脚本里面的输出")

4.2编写java代码

a.导入maven的jar包

<!-- https://mvnrepository.com/artifact/org.python/jython -->

<dependency>

    <groupId>org.python</groupId>

    <artifactId>jython</artifactId>

    <version>2.7.1b3</version>

</dependency>

b.编写java代码

import org.python.core.PyFunction;

import org.python.core.PyInteger;

import org.python.core.PyObject;

import org.python.util.PythonInterpreter;



import java.util.Properties;



public class Java03 {

    public static void main(String[] args) {

        Properties props = new Properties();

        //python的Lib库的位置

        //props.put("python.home", "C:\\Program Files\\Anaconda3\\Lib");

        props.put("python.console.encoding", "UTF-8");

        props.put("python.security.respectJavaAccessibility", "false");

        //注意:如果没有这一条会有Exception in thread "main" ImportError: Cannot import site module and its dependencies: No module named site报错

        props.put("python.import.site", "false");

        Properties preprops = System.getProperties();

        //python解释器

        PythonInterpreter.initialize(preprops, props, new String[0]);

        PythonInterpreter interpreter = new PythonInterpreter();

        //python文件路径,先执行python脚本,python在控制台上的输出会打印到出来并且会加载的内存中,方便后面程序来调用其中的方法

        interpreter.execfile("D:\\python\\pycharm\\pycharmProjects\\java-python\\Test01\\Python03.py");

        //这样得到了指定的函数

        PyFunction function = interpreter.get("adder", PyFunction.class);

        //给函数传入参数,这里不会有代码提示,所以要保证参数类型与数量正确,否则会报错

        int a = 3;

        int b = 4;

        PyObject pyobj = function.__call__(new PyInteger(a), new PyInteger(b));

        System.out.println(pyobj.toString());

    }

}

c.输出结果

参考:https://blog.csdn.net/IT_xiao_bai/article/details/79074988

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值