Java代码调用pythen脚本-原生RunTime.getRuntime.exec()方法

常用的方法有:

1、利用runtime在本地运行python脚本; runtime调用python实际上是通过cmd命令本地运行python脚本,对传递参数的长度有限制

2、通过jython调用; 通过jython调用的方式无法导入numpy等第三方库

3、java通过rpc(远程过程调用)调用python;远程rpc掉用不存在上述问题,Java程序作为客户端,pythen程序作为服务端。 但是问题是操作复杂。

原生Runtime在本地调用

1、调用方法 Runtime.getRuntime().exec()。

Runtime.getRuntime() 返回当前应用程序的Runtime对象,该对象的 exec() 方法指示Java虚拟机创建一个子进程执行指定的可执行程序,并返回与该子进程对应的Process对象实例。通过Process可以控制该子进程的执行或获取该子进程的信息。

该方法的参数可以是字符串,也可以是字符串数组。第一个参数是指定外部程序,最好是写全路径。第二个是指定脚本文件路径

Runtime.getRuntime().exec(new string["程序路径","脚本路径"])
​
Runtime.getRuntime().exce("程序路径  脚本路径")

proc.waitFor():指定等待程序运行,并获得运行的返回值,0表示成功,1表示远程调用失败,2表示pythen脚本出错。


//java 调用pythen文件对数据库进行数据分析的操做,并将pythen打印到控制台的数据打印到Java控制台。
public void communityDivision(){

        Process proc;
        try {
            proc = Runtime.getRuntime().exec("D:\\develop\\anaconda3\\python.exe C:\\Users\\DELL\\Desktop\\jiaoben\\jiaoben\\企业关系计算\\Louvain.py");
            BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream(),"utf-8"));
            String line = null;
            while ((line = in.readLine()) != null) {
                System.out.println(line);
            }
            in.close();
            int i = proc.waitFor();
            System.out.println("pythen文件执行结果:"+i);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }

注意问题:使用Runtime原生调用方法,没办法接受自定义的返回值,只能读取pythen脚本打印到控制台的内容。因为pythen代码在默认是GBK编码,读取内容时间容易出现乱码问题。

解决办法有两种,问题原因就是Java和pythen中编码格式不一样,保持统一就好。

Java中指定编码格式,直接在创建字符输入流对象的时候指定读取的编码规则。

BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream(),"utf-8"));

pythen中指定打印的编码格式

import sys
import io
​
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值