Java调用Python脚本传递数据并返回计算结果

需求:最近在使用基于Java编写的Cloudsim 4.0云仿真平台进行虚拟机动态迁移实验,由于中间有需要用到深度强化学习算法,因此需要将集群的状态表示为二维数组,比如物理机的计算能力Mips,RAM,带宽等等。希望将这样的二维数组传入到带torch等第三方库的Python脚本进行深度强化学习训练,所以就有二维int数组的传入,和从Python计算后的结果返回读取这个需求

一、实现思路:将Java中的data结构化为字符串,以命令行参数的形式传入Python中

目前有几种Java调用Python的方法,不过能良好兼容Python第三方库的方法通常是使用

Process proc = Runtime.getRuntime().exec(args1); // 执行Python脚本并传参数

如果只是简单传入几个数字,或者几个URL,比如可直接写为

int num1 = 5;
int num2 = 10;
Process proc = Runtime.getRuntime().exec(args1, String.valueOf(num1), String.valueOf(num2));

而如果要传入多维数组且每次传递时数组的大小会变,比如

int[][] stateInt = new int[][]{{2500, 5, 2610, 2620, 2630, 2640, 2650, 2660},  // Mips
                               {870,  5, 4091, 4092, 4093, 4094, 4095, 4096}}; // RAM

则需要把要传入的多维数据,结构化为可分割的字符串,上述二维数组就可转变为如下字符串

"2500 5 2610 2620 2630 2640 2650 2660;870 5 4091 4092 4093 4094 4095 4096"

这样传入到Python中就可以根据;和<空格>通过split()将二维数组恢复出来

二、Python实现代码

import sys
from selenium import webdriver
import torch

def policy(state):
    action = [2, 1, 0, 0]
    action[0] += state[0][1]
    return action

def str2int(stateStr):
    '''将完整字符串转换为二维数组'''
    stateList = []
    multiVimState = stateStr.split(';')
    for singleVimState in multiVimState:
        elements = singleVimState.split(' ')
        singleVimList = []
        for e in elements:
            singleVimList.append(int(e))
        stateList.append(singleVimList)
    return stateList

def int2str(actionIntArr):
    '''将形如[0,1,0,0,0]的int动作向量转化为01000字符串,方便Java处理'''
    actionStr = '';
    for e in actionIntArr:
        actionStr += str(e)
    return actionStr

if __name__ == '__main__':
    state = []
    stateStr = sys.argv[1];
    stateIntArr = str2int(stateStr)
    actionIntArr = policy(stateIntArr)
    actionStr = int2str(actionIntArr)
    # [2+5=7, 1, 0, 0] => 7100
    print(actionStr)

三、Java实现代码

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class testPython {
    /**
     * 将整型state数组转换为带分隔符的字符串,方便以命令方式传递给Python文件以进行计算
     * @param stateInt 当前虚机 + 所有主机状态向量
     * @return
     */
    public static String state2str(int[][] stateInt){
        String stateStr = "";
        for (int i = 0; i < stateInt.length; i++) {
            for (int j = 0; j < stateInt[0].length; j++) {
                if (j == 0)  stateStr += String.valueOf(stateInt[i][j]);
                else         stateStr += " " + String.valueOf(stateInt[i][j]);
            }
            if (i != stateInt.length - 1)  stateStr += ";";
        }
        return stateStr;
    }

    public static void main(String[] args) throws Exception {
        // Python文件地址(Linux)
        String pyPath = "/XXXX/XXXX.py";

        int[][] stateInt = new int[][]{{2500, 5, 2610, 2620, 2630, 2640, 2650, 2660},  // Mips
                                       {870,  5, 4091, 4092, 4093, 4094, 4095, 4096}}; // RAM
        // 将整型state数组转换为带分隔符的字符串,方便以命令方式传递给Python文件以进行计算
        String stateStr = state2str(stateInt);
        String[] args1 = new String[] {"python", pyPath, stateStr};
        // 执行Python文件,并传入参数
        Process proc = Runtime.getRuntime().exec(args1);
        // 获取Python输出字符串作为输入流被Java读取
        BufferedReader in = new BufferedReader(new InputStreamReader( proc.getInputStream() ));
        String actionStr = in.readLine();
        if (actionStr != null)
            System.out.println(actionStr);

        in.close();
        proc.waitFor();

        // 将获取的字符串分割为字符串数组,然后逐个元素转换为int并求和
        String nums[] = actionStr.split("");
        int sum = 0;
        for (int i = 0; i < nums.length; i++)
            sum += Integer.valueOf(nums[i]);
        System.out.println("求和为:" + sum);
    }
}

运行Java代码后得到如下结果

到此这篇关于Java调用Python脚本传递数据并返回计算结果的文章就介绍到这了,更多相关Java调用Python脚本内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java实现的执行python脚本工具类示例【使用jython.jar】

    本文实例讲述了Java实现的执行python脚本工具类.分享给大家供大家参考,具体如下: 这里java中执行python脚本工具类,需要使用jython.jar java中执行python脚本工具类,学习的时候写着玩: import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; i

  • 利用Python+Java调用Shell脚本时的死锁陷阱详解

    前言 最近有一项需求,要定时判断任务执行条件是否满足并触发 Spark 任务,平时编写 Spark 任务时都是封装为一个 Jar 包,然后采用 Shell 脚本形式传入所需参数执行,考虑到本次判断条件逻辑复杂,只用 Shell 脚本完成不利于开发测试,所以调研使用了 Python 和 Java 分别调用 Spark 脚本的方法. 使用版本为 Python 3.6.4 及 JDK 8 Python 主要使用 subprocess 库.Python 的 API 变动比较频繁,在 3.5 之后新增了

  • java直接调用python脚本的例子

    复制代码 代码如下: import java.io.BufferedReader;import java.io.InputStreamReader; public class Main { public static void main(String[] args) {  try {   System.out.println("start");   Process pr = Runtime.getRuntime().exec("python test.py"); B

  • Java程序中实现调用Python脚本的方法详解

    本文实例讲述了Java程序中实现调用Python脚本的方法.分享给大家供大家参考,具体如下: 在程序开发中,有时候需要Java程序中调用相关Python脚本,以下内容记录了先关步骤和可能出现问题的解决办法. 1.在Eclipse中新建Maven工程: 2.pom.xml文件中添加如下依赖包之后update maven工程: <dependency> <groupId>org.python</groupId> <artifactId>jython</ar

  • java 直接调用python脚本,并传递参数代码实例

    最近陆续用python写了很多文件处理脚本,虽然功能都比较简单 ,但还是感觉到python对文件处理的简洁高效 ,越发觉得java的语法相当的繁琐~ 接到个需求处理ftp数据接口 .所以想把python脚本也用上.java代码定时扫描ftp数据仓库 ,调用python脚本入库. 直接采用java执行系统命令的方式 @Async public void readFileByPython(List<String> filePaths) throws FileNotFoundException {

  • Java调用Python脚本传递数据并返回计算结果

    需求:最近在使用基于Java编写的Cloudsim 4.0云仿真平台进行虚拟机动态迁移实验,由于中间有需要用到深度强化学习算法,因此需要将集群的状态表示为二维数组,比如物理机的计算能力Mips,RAM,带宽等等.希望将这样的二维数组传入到带torch等第三方库的Python脚本进行深度强化学习训练,所以就有二维int数组的传入,和从Python计算后的结果返回读取这个需求 一.实现思路:将Java中的data结构化为字符串,以命令行参数的形式传入Python中 目前有几种Java调用Python

  • 教你在Excel中调用Python脚本实现数据自动化处理的方法

    目录 一.为什么将Python与Excel VBA集成? 二.为什么使用xlwings? 三.玩转xlwings 这次我们会介绍如何使用xlwings将Python和Excel两大数据工具进行集成,更便捷地处理日常工作. 说起Excel,那绝对是数据处理领域王者般的存在,尽管已经诞生三十多年了,现在全球仍有7.5亿忠实用户,而作为网红语言的Python,也仅仅只有700万的开发人员. Excel是全世界最流行的编程语言.对,你没看错,自从微软引入了LAMBDA定义函数后,Excel已经可以实现编

  • Jmeter调用Python脚本实现参数互相传递的实现

    接口性能测试时,接口请求参数是根据一定的规则拼接后进行MD5加密后再进行传参,因此借助于python脚本实现,则可以有效提升测试效率. 1.分析参数加密规则:NonceStr:时间戳 + 一个小于 1000 的随机数: Sign:"UserID=" + UserID+ "&" + "NonceStr=" + NonceStr + "固定的字符串": 其中UserID是上千个不同的数据已进行CSV文件参数化处理: 2.编

  • 总结Java调用Python程序方法

    如何使用Java调用Python程序 本文为大家介绍如何java调用python方法,供大家参考. 实际工程项目中可能会用到Java和python两种语言结合进行,这样就会涉及到一个问题,就是怎么用Java程序来调用已经写好的python脚本呢,一共有三种方法可以实现,具体方法分别为大家介绍: 1. 在java类中直接执行python语句 此方法需要引用org.python包,需要下载Jpython.在这里先介绍一下Jpython.下面引入百科的解释: Jython是一种完整的语言,而不是一个J

  • C语言中程序如何调用Python脚本

    有时候在写C语言程序的时候又想利用一下python强大的模块,于是C与python的混合编程便应运而生. 下面简单说说在C语言编译环境中调用python脚本文件的基础应用. 一.环境配置 以vs2017为例. 0x00 平台 首先你要知道你电脑上安装的python环境是64位还是32位,vs的编译平台需要与python环境一致. 比如我的python环境是64位,vs工程就要配置成x64. 右键点击你的解决方案,点击属性, 0x01 添加 包含目录 和 库目录 在属性窗口双击"VC++ Dire

  • Python代码一键转Jar包及Java调用Python新姿势

    需求背景 进击的Python 随着人工智能的兴起,Python这门曾经小众的编程语言可谓是焕发了第二春. 以tensorflow.pytorch等为主的机器学习/深度学习的开发框架大行其道,助推了python这门曾经以爬虫见长(python粉别生气)的编程语言在TIOBE编程语言排行榜上一路披荆斩棘,坐上前三甲的宝座,仅次于Java和C,将C++.JavaScript.PHP.C#等一众劲敌斩落马下. 当然,轩辕君向来是不提倡编程语言之间的竞争对比,每一门语言都有自己的优势和劣势,有自己应用的领

  • 详解java调用python的几种用法(看这篇就够了)

    java调用python的几种用法如下: 在java类中直接执行python语句 在java类中直接调用本地python脚本 使用Runtime.getRuntime()执行python脚本文件(推荐) 调用python脚本中的函数 准备工作: 创建maven工程,结构如下: 到官网https://www.jython.org/download.html下载Jython的jar包或者在maven的pom.xml文件中加入如下代码: <dependency> <groupId>org

  • 通过Jython调用Python脚本的实现方法

    前言 前面在 BeanShell 里面是通过 java 脚本实现请求的预处理,jmeter里面也可以调用python的脚本,需安装 jython.jar 的插件. Jython 是 Python 的纯 Java 实现.她无缝地结合了 Java 类与 Python,使用户能以 Python 语言的语法编写在 Java 虚拟机上运行的 软件 Jpython Jython 是 Python 的纯 Java 实现.她无缝地结合了 Java 类与 Python,使用户能以 Python 语言的语法编写在

随机推荐