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')

要在Java调用Python代码,可以使用Jython库。Jython是一个用于在Java虚拟机上运行Python代码的库。它允许您在Java中导入和调用Python模块。 下面是一个使用Jython库在Java调用Python代码的例子: 1. 首先,您需要将Jython库添加到Java项目中。您可以从Jython官方网站(https://www.jython.org/download)下载Jython安装包并解压缩它。 2. 然后,您需要在Java代码中导入Jython库: ```java import org.python.core.PyObject; import org.python.util.PythonInterpreter; ``` 3. 接下来,您可以使用以下代码Java调用Python代码: ```java // 创建Python解释器 PythonInterpreter interpreter = new PythonInterpreter(); // 执行Python代码 interpreter.exec("print('Hello, World!')"); // 调用Python函数 PyObject someFunction = interpreter.get("some_function"); PyObject result = someFunction.__call__(); // 将Python对象转换为Java对象 String strResult = (String) result.__tojava__(String.class); ``` 4. 如果您想在Java中使用Runtime.getRuntime()来运行Python代码,可以使用以下代码: ```java // 创建Runtime对象 Runtime rt = Runtime.getRuntime(); // 创建Process对象来运行Python脚本 Process pr = rt.exec("python script.py"); // 获取脚本输出 BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream())); String line = null; while ((line = input.readLine()) != null) { System.out.println(line); } ``` 在此示例中,您需要将“script.py”替换为您要运行的Python脚本的名称或路径。请注意,如果Python脚本需要输入,您还需要使用Process对象的输出流将输入发送到脚本中。 希望这可以帮助您在Java调用Python代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值