为您推荐:
精华内容
最热下载
问答
  • 5星
    11.95MB weixin_43911798 2021-03-26 08:09:14
  • 5星
    28KB m0_52957036 2019-12-30 19:17:39
  • 5星
    71.5MB xipengbozai 2021-04-30 16:46:45
  • 5星
    17.55MB qq_31899125 2021-05-22 21:52:40
  • 5星
    9.55MB HUANGliang_ 2021-08-13 14:52:28
  • 5星
    800KB baidu_36499789 2020-12-12 16:03:00
  • 5星
    118.23MB qq_21548021 2020-12-04 12:38:16
  • 5星
    4.44MB qq_44781688 2021-07-03 19:09:34
  • 5星
    96.29MB liaoqingjian 2021-05-24 09:29:02
  • 5星
    15KB qq_52889967 2021-06-08 19:42:30
  • 7KB meiqi0538 2018-03-21 13:25:39
  • 31KB weixin_38672807 2020-08-30 02:52:30
  • 5星
    65KB weixin_42172972 2021-03-04 18:32:03
  • 36.64MB liujie3221 2018-12-06 16:36:30
  • 482KB weixin_38741996 2021-01-20 01:48:00
  • 前言 这一章来学习如何使用 java 调用 python 机器学习模块,毕竟 ...第三步:java调用python脚本函数(如何传递参数) 第四步:java调用python机器学习模块并运行 上面三步都需要调用 jython 库,两种加入项目方法:

    前言

    这一章来学习如何使用 java 调用 python 机器学习模块,毕竟 python 在算法方法好用,但是做 web 项目还是 java 更优,最近有个项目想要集成机器学习算法,这里简单记录一下(默认使用idea开发工具,默认都会创建maven项目,不会自行百度)。

    java 调用 python,分三步来学习:

    • 第一步:java 调用 python 语句
    • 第二步:java 调用 python 脚本
    • 第三步:java调用python脚本函数(如何传递参数)
    • 第四步:java调用python机器学习模块并运行

    上面三步都需要调用 jython 库,两种加入项目方法:

    • 官网下载 jar 包,手动加入
    • 在 pom 文件中直接加入依赖
        <dependency>
            <groupId>org.python</groupId>
            <artifactId>jython-standalone</artifactId>
            <version>2.7.0</version>
        </dependency>
    

    1、java 调用 python 语句

    首先要在idea中导入jython库,上面提到的两种方法,我使用的是第二种,即在 pom 文件中加入依赖,简单明了。

    创建一个 javaRunPython 类,执行下列代码:

    PythonInterpreter interpreter = new PythonInterpreter();
    interpreter.exec("a=1+2; ");
    interpreter.exec("print(a);");
    

    运行结果如下:

    在这里插入图片描述

    另外,我发现一个有趣的现象,无论是"print a",还是"print(a)",居然都没有报错,也就是说 jython 兼容支持 python2 和 python3 两种语法。

    2、java 调用 python 脚本

    2.1 PythonInterpreter 调用 python 脚本

    首先要写一个 python 脚本用来被调用,内容随意,下面是我写的:

    hello = 'hello world, this is using java to pring python word'
    print(hello)
    

    然后在 maven 项目中,运行:

    import org.python.util.PythonInterpreter;
    
    PythonInterpreter interpreter = new PythonInterpreter();
    interpreter.execfile("E:\\pythonTest.py");
    

    运行结果如下:

    在这里插入图片描述

    上面调用的只是普通的 python 脚本,如果脚本中导入了第三方库,还能不能运行呢?测试一下,写一个简单的生成矩阵 python 脚本:

    print("sdafd")
    import numpy as np
    n = np.arange(0, 30, 2)
    n = n.reshape(3, 5)
    print(n)
    print("dafdafda")
    

    运行结果:

    在这里插入图片描述

    由上图可以看到,只执行了第一句,当导入第三方库的时候报错了,这个是因为在 jython 库中不存在 numpy 模块,自然会报错。

    由此可以得出:PythonInterpreter 可以简单执行普通的 python 脚本,但是对于带有第三方库的 python 脚本就不行了。

    2.2 使用 Runtime 调用 python 脚本(推荐)

    先来个普通脚本:

    hello = 'hello world, this is using java to pring python word'
    print(hello)
    

    文件名为 Runtime.py

    Runtime 方法的 java 代码如下:

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    Process proc;
    try {
        proc = Runtime.getRuntime().exec("python E:\\Runtime.py");
        BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
        String line = null;
        while ((line = in.readLine()) != null) {
            System.out.println(line);
        }
        in.close();
        proc.waitFor();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    

    执行结果和上面一样

    再来看看带有第三方库的脚本:

    print("sdafd")
    import numpy as np
    n = np.arange(0, 30, 2)
    n = n.reshape(3, 5)
    print(n)
    print("dafdafda")
    

    因为文件名和位置没有变化,Runtime 的代码不变,再次执行,结果如下:

    在这里插入图片描述

    可以看到,完美执行,没有报错。

    这里说一下为什么没有报错:

    Runtime 执行本质类似于控制台调用 python.exe 去执行 python 脚本,也就是调用的 python 线程,python 仓库中本身是有 numpy 模块的,自然就不会报错了;

    proc = Runtime.getRuntime().exec("python E:\\Runtime.py");
    

    上方的代码中,可以看到 python 字样,这个是调用 python 程序的,只是 python 配置了环境变量,否则就要换成 D:\Python3.8.6\python.exe 了。

    该方法有一个缺点,它得到 python 执行结果是通过数据流得到的,每次读取一行,相当于每执行一次就要读取一次结果,这就会导致我们运行的过程中很耗时。

    3、java 调用 python 脚本函数(如何传递参数)

    这次写一个带参数的 python 脚本——简单的两数相加:

    def add(x,y):
       return x+y
    

    脚本名称为 add.py,java 调用 python 函数代码为:

    PythonInterpreter interpreter = new PythonInterpreter();
    interpreter.execfile("E:\\RunTime.py");
    
    // 第一个参数为期望获得的函数(变量)的名字,第二个参数为期望返回的对象类型
    PyFunction pyFunction = interpreter.get("add", PyFunction.class);
    int a = 5, b = 10;
    //调用函数,如果函数需要参数,在Java中必须先将参数转化为对应的“Python类型”
    PyObject pyobj = pyFunction.__call__(new PyInteger(a), new PyInteger(b));
    System.out.println("the anwser is: " + pyobj);
    

    运行结果:

    在这里插入图片描述

    4、java 调用 python 机器学习模型

    java 调用 python 机器学习模型,我总结了一下共有四种:

    1. 利用上面的 java 调用 python 脚本——训练集和测试集写入文本中,python 脚本进行读取
    2. 将 python 训练的模型参数保存到文本中,用 java 代码重现模型的预测算法。这种工作量很大,而且出现的 bug 几率大大增加。最重要的是很多深度学习的框架就没办法用了。
    3. 使用 python 进程运行深度学习中训练的模型,在 java 应用程序中调用 python 进程提供的服务。这种方法没尝试过。python 语言写得程序毕竟还是在 python 环境中执行最有效率。而且 python 应用和 java 应用可以运行在不同的服务器上,通过进程的远程访问调用。
    4. 将机器学习模型保存为 pmml 文件,然后 java 调用 pmml 文件。这种方法是网上最常见的方法,进行上线部署的时候,不会依赖于 python 环境,推荐使用。

    上面四种方法,前三种都需要依赖于 python 环境,如果要部署的系统中存在 python 环境那么使用前三种是可以的,如果没有,那么第四种方法是最优的。

    下面对于 pmml 进行介绍和实例。

    4.1 pmml 介绍

    PMML:Predictive Model Markup Language 预测模型标记语言。data mining group 推出的,有十多年的历史了。是一种可以呈现预测分析模型的事实标准语言。标准东西的好处就是,各种开发语言都可以使用相应的包,把模型文件转成这种中间格式,而另外一种开发语言,可以使用相应的包导入该文件做线上预测。

    PMML 是数据挖掘的一种通用的规范,它用统一的 XML 格式来描述我们生成的机器学习模型。这样无论你的模型是 sklearn,R 还是 Spark MLlib 生成的,我们都可以将其转化为标准的 XML 格式来存储。当我们需要将这个 PMML 的模型用于部署的时候,可以使用目标环境的解析 PMML 模型的库来加载模型,并做预测。

    可以看出,要使用 PMML,需要两步的工作,第一块是将离线训练得到的模型转化为 PMML 模型文件,第二块是将 PMML 模型文件载入在线预测环境,进行预测。这两块都需要相关的库支持。

    4.2 实例代码实现

    针对 CIC-IDS2017 数据集,sklearn 决策树机器学习模型保存为 pmml 文件实现代码:

    import pandas as pd
    from sklearn2pmml.pipeline import PMMLPipeline
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.model_selection import train_test_split
    from sklearn2pmml import sklearn2pmml
    
    # 加载数据
    raw_data_filename = "data/clearData/total_expend.csv"
    print("Loading raw data...")
    raw_data = pd.read_csv(raw_data_filename, header=None,low_memory=False)
    
    # 随机抽取比例
    # raw_data=raw_data.sample(frac=0.03)
    
    # 将非数值型的数据转换为数值型数据
    raw_data[last_column_index], attacks = pd.factorize(raw_data[last_column_index], sort=True)
    # 对原始数据进行切片,分离出特征和标签,第1~41列是特征,第42列是标签
    features = raw_data.iloc[:, :raw_data.shape[1] - 1]  # pandas中的iloc切片是完全基于位置的索引
    labels = raw_data.iloc[:, raw_data.shape[1] - 1:]
    # 数据标准化
    # features = preprocessing.scale(features)
    # features = pd.DataFrame(features)
    # 将多维的标签转为一维的数组
    labels = labels.values.ravel()
    
    # 将数据分为训练集和测试集,并打印维数
    df = pd.DataFrame(features)
    X_train, X_test, y_train, y_test = train_test_split(df, labels, train_size=0.8, test_size=0.2, stratify=labels)
    
    pipeline = PMMLPipeline([("classifier", DecisionTreeClassifier(criterion='entropy', max_depth=12, min_samples_leaf=1, splitter="best"))])
    pipeline.fit(X_train, y_train)
    sklearn2pmml(pipeline, "data/pmml/DecisionTreeIris.pmml", with_repr = True)
    

    存储的 pmml 文件内容:

    在这里插入图片描述

    java 调用生成的 pmml 文件,并进行预测新数据代码:

    import org.dmg.pmml.FieldName;
    import org.dmg.pmml.PMML;
    import org.jpmml.evaluator.*;
    import org.jpmml.evaluator.support_vector_machine.VoteDistribution;
    import org.springframework.core.io.ClassPathResource;
    import org.springframework.core.io.Resource;
    import org.xml.sax.SAXException;
    
    import javax.xml.bind.JAXBException;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.HashMap;
    import java.util.LinkedHashMap;
    import java.util.List;
    import java.util.Map;
    import java.io.*;
    
    /**
     *  分类模型测试
     */
    class PMMLDemo {
    
        /**
         *  加载模型
         */
        private Evaluator loadPmml() {
            PMML pmml = new PMML();
            InputStream inputStream = null;
            try {
                // 读取resources文件夹下的pmml文件
                Resource resource = new ClassPathResource("DecisionTreeIris.pmml");
                inputStream = resource.getInputStream();
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (inputStream == null) {
                return null;
            }
            InputStream is = inputStream;
            try {
                pmml = org.jpmml.model.PMMLUtil.unmarshal(is);
            } catch (SAXException | JAXBException e1) {
                e1.printStackTrace();
            } finally {
                //关闭输入流
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            ModelEvaluatorFactory modelEvaluatorFactory = ModelEvaluatorFactory.newInstance();
            return modelEvaluatorFactory.newModelEvaluator(pmml);
        }
    
        /**
         *  分类预测
         */
        private void predict(Evaluator evaluator,Map<String, Double> featuremap) {
    
            List<InputField> inputFields = evaluator.getInputFields();
            System.out.println(inputFields);
            // 从原始特征获取数据,作为模型输入
            Map<FieldName, FieldValue> arguments = new LinkedHashMap<FieldName, FieldValue>();
            for (InputField inputField : inputFields) {
                // 特征名称
                FieldName inputFieldName = inputField.getName();
                // 特征值
                Object rawValue = featuremap.get(inputFieldName.getValue());
                FieldValue inputFieldValue = inputField.prepare(rawValue);
                arguments.put(inputFieldName, inputFieldValue);
            }
            // 预测结果
            Map<FieldName, ?> results = evaluator.evaluate(arguments);
            List<TargetField> targetFields = evaluator.getTargetFields();
            for (TargetField targetField : targetFields) {
                FieldName targetFieldName = targetField.getName();
                Object targetFieldValue = results.get(targetFieldName);
                System.err.println("target: " + targetFieldName.getValue()
                        + " value: " + targetFieldValue);
            }
    
        }
    
        //读取csv文件
        private static String readCSV(){
            //第一步:先获取csv文件的路径,通过BufferedReader类去读该路径中的文件
            File csv = new File("E:\\ideaProject\\javaRunPython\\src\\main\\resources\\1.csv");
            String lineDta = "";
            try{
                //第二步:从字符输入流读取文本,缓冲各个字符,从而实现字符、数组和行(文本的行数通过回车符来进行判定)的高效读取。
                BufferedReader textFile = new BufferedReader(new FileReader(csv));
                //第三步:将文档的下一行数据赋值给lineData,并判断是否为空,若不为空则输出
                while (textFile.readLine()!= null){
                    lineDta = textFile.readLine();
                }
                textFile.close();
            }catch (FileNotFoundException e){
                System.out.println("没有找到指定文件");
            }catch (IOException e){
                System.out.println("文件读写出错");
            }
            return lineDta;
        }
    
        public static void main(String args[]){
            PMMLDemo demo = new PMMLDemo();
            Evaluator model = demo.loadPmml();
            Map<String, Double> data = new HashMap<String, Double>();
            //读取测试数据(一行),并对其进行处理
            String test = readCSV();
            System.out.println(test);
            String[] tests=test.split("\t");
            for(int i=0;i<tests.length-1;i++){
                data.put(""+i,Double.valueOf(tests[i]));
            }
            //将测试数据data放入模型中进行预测
            demo.predict(model,data);
        }
    }
    
    

    先说一下最终结果:

    在这里插入图片描述

    打印的时候,用的是红色 err 打印的(注意这里不是报错),显示的数据 data 对于各个类别预测概率,其中预测类别为 6 的概率最大为 99.4%(标红框)。

    4.3 代码实例解释

    对于 python 的代码这里不解释了,比较简单。

    具体说一下 java 的,主要分为三部分:

    (1)java 读取 pmml 文件并将其转换为 java 机器学习模型 model

    简单来说,就是利用流读取 pmml 文件,然后 java 导入的 pmml 库将其实现为一个机器学习模块。

    (2)读取 csv 测试数据,并进行数据处理

    因为 CIC-IDS2017 数据集比较大(共有 80 个特征),所以不能手写,看网上的例子,一般是通过如下进行手动写的:

    data.put("x1", 5.1);
    data.put("x2", 3.5);
    data.put("x3", 1.4);
    data.put("x4", 0.2);
    

    这里需要说一下为什么数据集是一个 map 形式,要知道在 python 里面,数据集就是单纯数据列(只有 value,没有 key),这是因为在 python 进行数据训练的时候,sklearn 的决策树模型会自动加一个 key,这个 key 就是数据的索引。

    我再看网上的例子的时候,发现有一部分手写测试数据的时候,并没有写全,但是依然能够运行,这个是因为机器学习模型并没有全部应用特征数据,就比如上面的决策树,它的层数只有十几层,也就是用到了只是十几个特征,你只需要将这十几个特征写入数据集就行,前提是这十几个特征的索引你要写对,其实可以打印一下模型中的特征,也就是下面的 inputFields 的索引:

     for (InputField inputField : inputFields) {
        // 特征名称
        FieldName inputFieldName = inputField.getName();
        // 特征值
        Object rawValue = featuremap.get(inputFieldName.getValue());
        FieldValue inputFieldValue = inputField.prepare(rawValue);
        arguments.put(inputFieldName, inputFieldValue);
    }
    

    在对数据集进行处理的时候,曾遇到一个问题,就是读取 CSV 文件后获得一个字符,如何切分的问题。读取后的字符串是这个样子:

    在这里插入图片描述

    我一开始用单空格切分,发现不行,双空格也不行,打印的时候,发现字符串中有很多\t,于是就用\t 分割,果然正确,网上查了一下\t 表示

    \t 是补全当前字符串长度到 8 的整数倍,最少 1 个最多 8 个空格,补多少要看你\t 前字符串长度。

    看了这个解释,顿时明白了,csv 文件本身就是表格性质的,\t 相当于补全了。

    (3)读取测试数据 data,进行预测

    这一步理解起来就比较简单了,因为模型是决策树,从根节点出发,读取特征(inputFields),根据所需特征从 data 中读取出来,然后进行预测。

    4.4 遇到的问题

    遇到的问题主要是 java 这边的

    (1)java-source1.5 中不支持 multi-catch 语句

    在这里插入图片描述

    解决方案参考:https://blog.csdn.net/qq_39793857/article/details/106925721

    (2)Exception in thread “main“ java.lang.IllegalArgumentException: http://www.dmg.org/PMML-4_4 is not support

    在这里插入图片描述

    这是版本问题,要修改 pmml 文件的表头,具体参考:
    https://blog.csdn.net/qq_32113189/article/details/107542225

    OK,今天就到这里,更多精彩内容关注我的个人网站:蓝亚之舟博客

    展开全文
    yuangan1529 2021-03-20 14:14:29
  • 49.03MB ahwwbm_81 2018-05-03 15:13:02
  • 10KB qq_35473473 2020-05-27 22:31:05
  • 5星
    17.87MB chmod_r_755 2015-10-30 14:14:09
  • 150.26MB omg_c 2018-09-05 09:56:52
  • 84KB weixin_38553648 2020-12-24 12:07:49
  • 48KB weixin_38708841 2020-08-26 04:19:12
  • 45KB weixin_38582716 2020-08-27 18:46:34
  • 5星
    7.92MB josh_wang 2013-02-20 10:06:13
  • 写在前面 为啥一个好好的岗位是Java开发工程师要去做写python呢?因为产品经理安排的(突然多少有点明白为啥程序员和...文章目录写在前面一、在java类中直接执行python语句二、在java中直接调用python脚本三、★★★使

    写在前面

    为啥一个好好的岗位是Java开发工程师要去做写python呢?因为产品经理安排的(突然多少有点明白为啥程序员和产品经理会一直开撕)。由于在选择企业的时候没看清企业性质,看了要求以为就是互联网企业,现在看看初为社畜的我还是太天真了。不过既然这几天已经在写python脚本了,那也不能浪费这段时间的经历了,毕竟python的闪光点也不少。于是想一下如何与老本行Java联系起来,就有了这篇博文。


    其实调用的方法也不难,具体调用方法有如下四种(如果有其他办法记得在评论区留下呀):

    在使用Java调用python之前,需要导入依赖环境。如,在maven项目中,需要导入如下依赖

    <dependency>
        <groupId>org.python</groupId>
        <artifactId>jython-standalone</artifactId>
        <!--python版本是2.x还是3.x在这里指定-->
        <version>2.7.0</version>	
    </dependency>
    

    一、在java类中直接执行python语句

    在Java类中调用python语句的方法如下

    import org.python.util.PythonInterpreter
    public class JavaRunPython {
        public static void main(String[] args) {
        	//首先调用python的解释器
            PythonInterpreter interpreter = new PythonInterpreter();
            //选择执行的的Python语句
            interpreter.exec("a='hello world'; ");
            interpreter.exec("print a;");
        }
    }
    

    这种方法用的不多、也不推荐大家使用。这里为了整个文章内容的完成性,我把这种方法放在这里。(控制台出现“ Failed to install ‘’: java.nio.charset.UnsupportedCharsetException: cp0”的红标时,不是出错了,而是兼容没做好,可以去运行配置中的Arguments中输入

    -Dpython.console.encoding=UTF-8
    

    在正常的情况下,Java工程师只需要调用python开发工程师写的脚本就行了,不会再在代码中加入python语句了。因为在Java语言中添加入其他语言,使Java的可读性下降、执行意义也不是很大(为了一两行代码,去导入python包的性价比太低;而且如果行数多了,就应该是集合成脚本并执行脚本了)

    二、在java中直接调用python脚本

    这种方式是有些Java程序员使用调用。首先将准备好的脚本,如plus.py

    a = 1
    b = 2
    print a + b
    

    则在Java中运行的模式是这样的:

    import org.python.util.PythonInterpreter;
    public class JavaPythonFile {
        public static void main(String[] args) {
            PythonInterpreter interpreter = new PythonInterpreter();
            //我在这里使用相对路径,注意区分
            interpreter.execfile("./plus.py");
        }
    }
    

    三、★★★使用Runtime.getRuntime()执行python脚本文件,推荐使用

    为什么推荐使用这种方式来调用python脚本呢?
    答:由于这种办法可以让进程与程序交互。可以看到出现的问题,便于解决

    如还是调用上面的脚本为例

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class RuntimeFunction {
        public static void main(String[] args) {
            Process proc;
            try {
            	/*
    			附加:
    			String[] args1=new String[]{"/home/huan/anaconda2/bin/python","/home/huan/myfile/pythonfile/helloword.py"};
                Process pr=Runtime.getRuntime().exec(args1);
    			String数组里的那一行很重要
    			首先一定要设置好你所使用的python的位置,切记不要直接使用python,因为系统会默认使用自带的python,所以一定要设置好你所使用的python的位置,否则可能会出现意想不到的问题(比如说我使用的是anaconda中的python,而ubuntu系统会默认调用自带的python,而我自带的python中并没有numpy库,所以会造成相应的代码不会执行的问题,所以设置好python的位置是很重要的)。还有就是要设置好py文件的位置,使用绝对路径。在这里插入代码片
    
           还有就是可以看出,此方法可以满足我们python代码中调用第三方库的情况,简单实用。
    			*/
                proc = Runtime.getRuntime().exec("python ./plus.py");
                BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
                String line = null;
                while ((line = in.readLine()) != null) {
                    System.out.println(line);
                }
                in.close();
                proc.waitFor();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } 
        }
    }
    

    对以上代码的解释
    首先,为什么要创建Process proc。我们可以去看官方文档:

    The ProcessBuilder.start() and Runtime.exec methods create a native process and return an instance of a subclass of Process that can be used to control the process and obtain information about it. The class Process provides methods for performing input from the process, performing output to the process, waiting for the process to complete, checking the exit status of the process, and destroying (killing) the process.

    这段文字的意思是: ProcessBuilder.start()和Runtime.exec两个方法会生成一个本地的进程,然后返回一个Processs子类的实例。通过这个实例可以控制进程以及获得关于进程的信息。这个Process类为进程提供可用于执行来自的输入的方法,然后执行输出到这个进程中,等待完成后,检查进程退出时的状态,然后停止这个进程。——换句话说,这个实例就是监视整个进程的。

    通过Process的getInputStream(),getOutputStream()和getErrorStream()方法可以得到输入输出流,然后通过InputStream可以得到程序对控制台的输出信息,通过OutputStream可以给程序输入指令,这样就达到了程序的交换功能。

    四、调用python脚本中的函数

    改造一下python脚本,注意严格的缩进。

    def add(a,b):
    	a = 1
    	b = 2
    	print a + b
    	return a+b
    

    调用的代码

    import org.python.core.PyFunction;
    import org.python.core.PyInteger;
    import org.python.core.PyObject;
    import org.python.util.PythonInterpreter;
    public class Function {
        public static void main(String[] args) {
            PythonInterpreter interpreter = new PythonInterpreter();
            interpreter.execfile("./plus.py");
                    
            // 第一个参数为期望获得的函数(变量)的名字,第二个参数为期望返回的对象类型
            PyFunction pyFunction = interpreter.get("add", PyFunction.class);
            int a = 5, b = 10;
            //调用函数,如果函数需要参数,在Java中必须先将参数转化为对应的“Python类型”
            PyObject pyobj = pyFunction.__call__(new PyInteger(a), new PyInteger(b)); 
            System.out.println("the anwser is: " + pyobj);
        }
    
    }
    

    参考文献:
    java调用python的几种用法(看这篇就够了)
    在Java中调用Python
    java调用python代码

    展开全文
    xt199711 2020-07-30 11:31:55
  • 1)编写mytest.py完成一个简单加法计算# coding:utf8#def 表示一个方法 adderdef adder(a, b):return a+b#这里执行adder方法并打印出...3)java调用python脚本的两种方式Process process = Runtime.getRuntime().ex...

    1)编写mytest.py完成一个简单加法计算

    # coding:utf8

    #def 表示一个方法 adder

    def adder(a, b):

    return a+b

    #这里执行adder方法并打印出结果

    print adder(1,2)

    2)运行以上脚本方式如图

    4840ce3f979050afe425a935644a501c.png

    1+2 = 3 打印成功!

    3)java调用python脚本的两种方式

    Process process = Runtime.getRuntime().exec("python E:\\mytest.py");

    InputStreamReader ir = new InputStreamReader(process.getInputStream());

    LineNumberReader input = new LineNumberReader(ir);

    String line;

    while((line = input.readLine()) != null)

    System.out.println(line);

    input.close();

    ir.close();

    结果如下图展示:该方法目前没找到可以给python传参,但是支持运行python脚本中的三方类库

    31d73cd2b02e325ce1e596a8a5297c27.png

    通过jython-standalone-2.7.0.jar调用python

    PythonInterpreter interpreter = new PythonInterpreter();

    interpreter.execfile("E:\\test.py");

    PyFunction func = (PyFunction)interpreter.get("retHtml",PyFunction.class);

    PyObject pyobj = func.__call__(new PyInteger(2016),new PyInteger(2016));

    System.out.println("retMsg = " + pyobj);

    展开全文
    weixin_30970411 2021-02-06 21:58:40
  • 55KB weixin_38638002 2020-08-27 18:49:32
  • 如何使用Java调用Python程序 本文为大家介绍如何java调用python方法,供大家参考。 实际工程项目中可能会用到Java和python两种语言结合进行,这样就会涉及到一个问题,就是怎么用Java程序来调用已经写好的python...

    原文:https://blog.csdn.net/IT_xiao_bai/article/details/79074988

    如何使用Java调用Python程序

    本文为大家介绍如何java调用python方法,供大家参考。
    实际工程项目中可能会用到Java和python两种语言结合进行,这样就会涉及到一个问题,就是怎么用Java程序来调用已经写好的python脚本呢,一共有三种方法可以实现,具体方法分别为大家介绍:

    1. 在java类中直接执行python语句

    此方法需要引用org.python包,需要下载Jpython。在这里先介绍一下Jpython。下面引入百科的解释:

    • Jython是一种完整的语言,而不是一个Java翻译器或仅仅是一个Python编译器,它是一个Python语言在Java中的完全实现。Jython也有很多从CPython中继承的模块库。最有趣的事情是Jython不像CPython或其他任何高级语言,它提供了对其实现语言的一切存取。所以Jython不仅给你提供了Python的库,同时也提供了所有的Java类。这使其有一个巨大的资源库。

    这里我建议下载最新版本的Jpython,因为可以使用的python函数库会比老版本的多些,目前最新版本为2.7。
    下载jar包请点击Download Jython 2.7.0 - Standalone Jar
    下载安装程序请点击Download Jython 2.7.0 - Installer
    如果使用maven依赖添加的话,使用下面的语句

    <span style="color:#000000"><code class="language-maven"><dependency>
    	<groupId>org.python</groupId>
    	<artifactId>jython-standalone</artifactId>
    	<version>2.7.0</version>
    </dependency>
    </code></span>

    以上准备好了,就可以直接在java类中写python语句了,具体代码如下:

    <span style="color:#000000"><code class="language-java">PythonInterpreter interpreter <span style="color:#df5000">=</span> <span style="color:#a71d5d">new</span> PythonInterpreter<span style="color:#969896">(</span><span style="color:#969896">)</span><span style="color:#969896">;</span>
    interpreter<span style="color:#969896">.</span><span style="color:#795da3">exec</span><span style="color:#969896">(</span><span style="color:#df5000">"a=[5,2,3,9,4,0]; "</span><span style="color:#969896">)</span><span style="color:#969896">;</span>
    interpreter<span style="color:#969896">.</span><span style="color:#795da3">exec</span><span style="color:#969896">(</span><span style="color:#df5000">"print(sorted(a));"</span><span style="color:#969896">)</span><span style="color:#969896">;</span>  <span style="color:#969896">//此处python语句是3.x版本的语法</span>
    interpreter<span style="color:#969896">.</span><span style="color:#795da3">exec</span><span style="color:#969896">(</span><span style="color:#df5000">"print sorted(a);"</span><span style="color:#969896">)</span><span style="color:#969896">;</span>   <span style="color:#969896">//此处是python语句是2.x版本的语法</span>
    </code></span>

    输出结果如下:

    在这里插入图片描述

    这里会看到输出的结果都是一样的,也就是说Jpython兼容python2.x和3.x版本的语句,运行速度会比直接运行python程序稍慢一点。
    但是每次运行结果都会提示console: Failed to install ‘’: java.nio.charset.UnsupportedCharsetException: cp0. 这样看起来很烦,因为每次运行结果都会出现红色的提示语句,以为是错误,程序员应该都不愿意看到这一幕,得想个办法解决。
    解决方法如下:
    在要执行的代码上右键, Run As>Run Configurations,选择第二个页签Arguments,在VM arguments中添加以下语句
    -Dpython.console.encoding=UTF-8
    然后Apply->Run就可以了。

    如下图所示:

    在这里插入图片描述

    2. 在java中调用本地python脚本

    首先在本地建立一个python脚本,命名为add.py,写了一个简单的两个数做加法的函数,代码如下:

    <span style="color:#000000"><code class="language-python"><span style="color:#a71d5d">def</span> <span style="color:#795da3">add</span><span style="color:#969896">(</span>a<span style="color:#969896">,</span>b<span style="color:#969896">)</span><span style="color:#969896">:</span>
        <span style="color:#a71d5d">return</span> a <span style="color:#df5000">+</span> b
    </code></span>

    python的功能函数已经写好,接下来我们写一个java的测试类(同样需要用到Jpython包),来测试一下是否可以运行成功。代码如下:

    <span style="color:#000000"><code class="language-java"><span style="color:#a71d5d">import</span> org<span style="color:#969896">.</span>python<span style="color:#969896">.</span>core<span style="color:#969896">.</span>PyFunction<span style="color:#969896">;</span>
    <span style="color:#a71d5d">import</span> org<span style="color:#969896">.</span>python<span style="color:#969896">.</span>core<span style="color:#969896">.</span>PyInteger<span style="color:#969896">;</span>
    <span style="color:#a71d5d">import</span> org<span style="color:#969896">.</span>python<span style="color:#969896">.</span>core<span style="color:#969896">.</span>PyObject<span style="color:#969896">;</span>
    <span style="color:#a71d5d">import</span> org<span style="color:#969896">.</span>python<span style="color:#969896">.</span>util<span style="color:#969896">.</span>PythonInterpreter<span style="color:#969896">;</span>
    
    <span style="color:#a71d5d">public</span> <span style="color:#a71d5d">class</span> Java_Python_test <span style="color:#969896">{</span>
    
    	<span style="color:#a71d5d">public</span> <span style="color:#a71d5d">static</span> <span style="color:#a71d5d">void</span> <span style="color:#795da3">main</span><span style="color:#969896">(</span>String<span style="color:#969896">[</span><span style="color:#969896">]</span> args<span style="color:#969896">)</span> <span style="color:#969896">{</span>
    		<span style="color:#969896">// TODO Auto-generated method stub</span>
    		PythonInterpreter interpreter <span style="color:#df5000">=</span> <span style="color:#a71d5d">new</span> PythonInterpreter<span style="color:#969896">(</span><span style="color:#969896">)</span><span style="color:#969896">;</span>
    		interpreter<span style="color:#969896">.</span><span style="color:#795da3">execfile</span><span style="color:#969896">(</span><span style="color:#df5000">"D:\\add.py"</span><span style="color:#969896">)</span><span style="color:#969896">;</span>
    				
    		<span style="color:#969896">// 第一个参数为期望获得的函数(变量)的名字,第二个参数为期望返回的对象类型</span>
    		PyFunction pyFunction <span style="color:#df5000">=</span> interpreter<span style="color:#969896">.</span><span style="color:#795da3">get</span><span style="color:#969896">(</span><span style="color:#df5000">"add"</span><span style="color:#969896">,</span> PyFunction<span style="color:#969896">.</span><span style="color:#a71d5d">class</span><span style="color:#969896">)</span><span style="color:#969896">;</span>
    		<span style="color:#a71d5d">int</span> a <span style="color:#df5000">=</span> <span style="color:#c76b29">5</span><span style="color:#969896">,</span> b <span style="color:#df5000">=</span> <span style="color:#c76b29">10</span><span style="color:#969896">;</span>
    		<span style="color:#969896">//调用函数,如果函数需要参数,在Java中必须先将参数转化为对应的“Python类型”</span>
    		PyObject pyobj <span style="color:#df5000">=</span> pyFunction<span style="color:#969896">.</span><span style="color:#795da3">__call__</span><span style="color:#969896">(</span><span style="color:#a71d5d">new</span> PyInteger<span style="color:#969896">(</span>a<span style="color:#969896">)</span><span style="color:#969896">,</span> <span style="color:#a71d5d">new</span> PyInteger<span style="color:#969896">(</span>b<span style="color:#969896">)</span><span style="color:#969896">)</span><span style="color:#969896">;</span> 
    		System<span style="color:#969896">.</span>out<span style="color:#969896">.</span><span style="color:#795da3">println</span><span style="color:#969896">(</span><span style="color:#df5000">"the anwser is: "</span> <span style="color:#df5000">+</span> pyobj<span style="color:#969896">)</span><span style="color:#969896">;</span>
    	<span style="color:#969896">}</span>
    <span style="color:#969896">}</span>
    </code></span>

    运行结果如图所示:

    在这里插入图片描述

    OK,测试成功了~

    关于Jpython更多详细的信息可以参考官方的相关文档,官网地址点这里

    注意:以上两个方法虽然都可以调用python程序,但是使用Jpython调用的python库不是很多,如果你用以上两个方法调用,而python的程序中使用到第三方库,这时就会报错java ImportError: No module named xxx。遇到这种情况推荐使用下面的方法,即可解决该问题。

    3. 使用Runtime.getRuntime()执行脚本文件(推荐)

    为了验证该方法可以运行含有python第三方库的程序,我们先写一个简单的python脚本,代码如下:

    <span style="color:#000000"><code class="language-python"><span style="color:#a71d5d">import</span> numpy <span style="color:#a71d5d">as</span> np
    
    a <span style="color:#df5000">=</span> np<span style="color:#969896">.</span>arange<span style="color:#969896">(</span><span style="color:#c76b29">12</span><span style="color:#969896">)</span><span style="color:#969896">.</span>reshape<span style="color:#969896">(</span><span style="color:#c76b29">3</span><span style="color:#969896">,</span><span style="color:#c76b29">4</span><span style="color:#969896">)</span>
    <span style="color:#a71d5d">print</span><span style="color:#969896">(</span>a<span style="color:#969896">)</span>
    </code></span>

    可以看到程序中用到了numpy第三方库,并初始化了一个3×4的一个矩阵。
    下面来看看怎么用Runtime.getRuntime()方法来调用python程序并输出该结果,java代码如下:

    <span style="color:#000000"><code class="language-java"><span style="color:#a71d5d">import</span> java<span style="color:#969896">.</span>io<span style="color:#969896">.</span>BufferedReader<span style="color:#969896">;</span>
    <span style="color:#a71d5d">import</span> java<span style="color:#969896">.</span>io<span style="color:#969896">.</span>IOException<span style="color:#969896">;</span>
    <span style="color:#a71d5d">import</span> java<span style="color:#969896">.</span>io<span style="color:#969896">.</span>InputStreamReader<span style="color:#969896">;</span>
    
    <span style="color:#a71d5d">public</span> <span style="color:#a71d5d">class</span> Demo1 <span style="color:#969896">{</span>
    
    	<span style="color:#a71d5d">public</span> <span style="color:#a71d5d">static</span> <span style="color:#a71d5d">void</span> <span style="color:#795da3">main</span><span style="color:#969896">(</span>String<span style="color:#969896">[</span><span style="color:#969896">]</span> args<span style="color:#969896">)</span> <span style="color:#969896">{</span>
    		<span style="color:#969896">// TODO Auto-generated method stub</span>
    		Process proc<span style="color:#969896">;</span>
    		<span style="color:#a71d5d">try</span> <span style="color:#969896">{</span>
    			proc <span style="color:#df5000">=</span> Runtime<span style="color:#969896">.</span><span style="color:#795da3">getRuntime</span><span style="color:#969896">(</span><span style="color:#969896">)</span><span style="color:#969896">.</span><span style="color:#795da3">exec</span><span style="color:#969896">(</span><span style="color:#df5000">"python D:\\demo1.py"</span><span style="color:#969896">)</span><span style="color:#969896">;</span><span style="color:#969896">// 执行py文件</span>
    			<span style="color:#969896">//用输入输出流来截取结果</span>
    			BufferedReader in <span style="color:#df5000">=</span> <span style="color:#a71d5d">new</span> BufferedReader<span style="color:#969896">(</span><span style="color:#a71d5d">new</span> InputStreamReader<span style="color:#969896">(</span>proc<span style="color:#969896">.</span><span style="color:#795da3">getInputStream</span><span style="color:#969896">(</span><span style="color:#969896">)</span><span style="color:#969896">)</span><span style="color:#969896">)</span><span style="color:#969896">;</span>
    			String line <span style="color:#df5000">=</span> null<span style="color:#969896">;</span>
    			<span style="color:#a71d5d">while</span> <span style="color:#969896">(</span><span style="color:#969896">(</span>line <span style="color:#df5000">=</span> in<span style="color:#969896">.</span><span style="color:#795da3">readLine</span><span style="color:#969896">(</span><span style="color:#969896">)</span><span style="color:#969896">)</span> <span style="color:#df5000">!=</span> null<span style="color:#969896">)</span> <span style="color:#969896">{</span>
    				System<span style="color:#969896">.</span>out<span style="color:#969896">.</span><span style="color:#795da3">println</span><span style="color:#969896">(</span>line<span style="color:#969896">)</span><span style="color:#969896">;</span>
    			<span style="color:#969896">}</span>
    			in<span style="color:#969896">.</span><span style="color:#795da3">close</span><span style="color:#969896">(</span><span style="color:#969896">)</span><span style="color:#969896">;</span>
    			proc<span style="color:#969896">.</span><span style="color:#795da3">waitFor</span><span style="color:#969896">(</span><span style="color:#969896">)</span><span style="color:#969896">;</span>
    		<span style="color:#969896">}</span> <span style="color:#a71d5d">catch</span> <span style="color:#969896">(</span>IOException e<span style="color:#969896">)</span> <span style="color:#969896">{</span>
    			e<span style="color:#969896">.</span><span style="color:#795da3">printStackTrace</span><span style="color:#969896">(</span><span style="color:#969896">)</span><span style="color:#969896">;</span>
    		<span style="color:#969896">}</span> <span style="color:#a71d5d">catch</span> <span style="color:#969896">(</span>InterruptedException e<span style="color:#969896">)</span> <span style="color:#969896">{</span>
    			e<span style="color:#969896">.</span><span style="color:#795da3">printStackTrace</span><span style="color:#969896">(</span><span style="color:#969896">)</span><span style="color:#969896">;</span>
    		<span style="color:#969896">}</span> 
    	<span style="color:#969896">}</span>
    <span style="color:#969896">}</span>
    </code></span>

    输出的结果如下图所示:
    在这里插入图片描述

    可以看到运行成功了,但有的朋友可能会问了,怎么在python程序中函数传递参数并执行出结果,下面我就举一例来说明一下。
    先写一个python的程序,代码如下:

    <span style="color:#000000"><code class="language-python"><span style="color:#a71d5d">import</span> sys
    
    <span style="color:#a71d5d">def</span> <span style="color:#795da3">func</span><span style="color:#969896">(</span>a<span style="color:#969896">,</span>b<span style="color:#969896">)</span><span style="color:#969896">:</span>
        <span style="color:#a71d5d">return</span> <span style="color:#969896">(</span>a<span style="color:#df5000">+</span>b<span style="color:#969896">)</span>
    
    <span style="color:#a71d5d">if</span> __name__ <span style="color:#df5000">==</span> <span style="color:#df5000">'__main__'</span><span style="color:#969896">:</span>
        a <span style="color:#df5000">=</span> <span style="color:#969896">[</span><span style="color:#969896">]</span>
        <span style="color:#a71d5d">for</span> i <span style="color:#a71d5d">in</span> <span style="color:#df5000">range</span><span style="color:#969896">(</span><span style="color:#c76b29">1</span><span style="color:#969896">,</span> <span style="color:#df5000">len</span><span style="color:#969896">(</span>sys<span style="color:#969896">.</span>argv<span style="color:#969896">)</span><span style="color:#969896">)</span><span style="color:#969896">:</span>
            a<span style="color:#969896">.</span>append<span style="color:#969896">(</span><span style="color:#969896">(</span><span style="color:#df5000">int</span><span style="color:#969896">(</span>sys<span style="color:#969896">.</span>argv<span style="color:#969896">[</span>i<span style="color:#969896">]</span><span style="color:#969896">)</span><span style="color:#969896">)</span><span style="color:#969896">)</span>
    
        <span style="color:#a71d5d">print</span><span style="color:#969896">(</span>func<span style="color:#969896">(</span>a<span style="color:#969896">[</span><span style="color:#c76b29">0</span><span style="color:#969896">]</span><span style="color:#969896">,</span>a<span style="color:#969896">[</span><span style="color:#c76b29">1</span><span style="color:#969896">]</span><span style="color:#969896">)</span><span style="color:#969896">)</span>
    </code></span>

    其中sys.argv用于获取参数url1,url2等。而sys.argv[0]代表python程序名,所以列表从1开始读取参数。
    以上代码实现一个两个数做加法的程序,下面看看在java中怎么传递函数参数,代码如下:

    <span style="color:#000000"><code class="language-java"><span style="color:#a71d5d">int</span> a <span style="color:#df5000">=</span> <span style="color:#c76b29">18</span><span style="color:#969896">;</span>
    <span style="color:#a71d5d">int</span> b <span style="color:#df5000">=</span> <span style="color:#c76b29">23</span><span style="color:#969896">;</span>
    <span style="color:#a71d5d">try</span> <span style="color:#969896">{</span>
    	String<span style="color:#969896">[</span><span style="color:#969896">]</span> args <span style="color:#df5000">=</span> <span style="color:#a71d5d">new</span> String<span style="color:#969896">[</span><span style="color:#969896">]</span> <span style="color:#969896">{</span> <span style="color:#df5000">"python"</span><span style="color:#969896">,</span> <span style="color:#df5000">"D:\\demo2.py"</span><span style="color:#969896">,</span> String<span style="color:#969896">.</span><span style="color:#795da3">valueOf</span><span style="color:#969896">(</span>a<span style="color:#969896">)</span><span style="color:#969896">,</span> String<span style="color:#969896">.</span><span style="color:#795da3">valueOf</span><span style="color:#969896">(</span>b<span style="color:#969896">)</span> <span style="color:#969896">}</span><span style="color:#969896">;</span>
    	Process proc <span style="color:#df5000">=</span> Runtime<span style="color:#969896">.</span><span style="color:#795da3">getRuntime</span><span style="color:#969896">(</span><span style="color:#969896">)</span><span style="color:#969896">.</span><span style="color:#795da3">exec</span><span style="color:#969896">(</span>args<span style="color:#969896">)</span><span style="color:#969896">;</span><span style="color:#969896">// 执行py文件</span>
    
    	BufferedReader in <span style="color:#df5000">=</span> <span style="color:#a71d5d">new</span> BufferedReader<span style="color:#969896">(</span><span style="color:#a71d5d">new</span> InputStreamReader<span style="color:#969896">(</span>proc<span style="color:#969896">.</span><span style="color:#795da3">getInputStream</span><span style="color:#969896">(</span><span style="color:#969896">)</span><span style="color:#969896">)</span><span style="color:#969896">)</span><span style="color:#969896">;</span>
    	String line <span style="color:#df5000">=</span> null<span style="color:#969896">;</span>
    	<span style="color:#a71d5d">while</span> <span style="color:#969896">(</span><span style="color:#969896">(</span>line <span style="color:#df5000">=</span> in<span style="color:#969896">.</span><span style="color:#795da3">readLine</span><span style="color:#969896">(</span><span style="color:#969896">)</span><span style="color:#969896">)</span> <span style="color:#df5000">!=</span> null<span style="color:#969896">)</span> <span style="color:#969896">{</span>
    		System<span style="color:#969896">.</span>out<span style="color:#969896">.</span><span style="color:#795da3">println</span><span style="color:#969896">(</span>line<span style="color:#969896">)</span><span style="color:#969896">;</span>
    	<span style="color:#969896">}</span>
    	in<span style="color:#969896">.</span><span style="color:#795da3">close</span><span style="color:#969896">(</span><span style="color:#969896">)</span><span style="color:#969896">;</span>
    	proc<span style="color:#969896">.</span><span style="color:#795da3">waitFor</span><span style="color:#969896">(</span><span style="color:#969896">)</span><span style="color:#969896">;</span>
    <span style="color:#969896">}</span> <span style="color:#a71d5d">catch</span> <span style="color:#969896">(</span>IOException e<span style="color:#969896">)</span> <span style="color:#969896">{</span>
    	e<span style="color:#969896">.</span><span style="color:#795da3">printStackTrace</span><span style="color:#969896">(</span><span style="color:#969896">)</span><span style="color:#969896">;</span>
    <span style="color:#969896">}</span> <span style="color:#a71d5d">catch</span> <span style="color:#969896">(</span>InterruptedException e<span style="color:#969896">)</span> <span style="color:#969896">{</span>
    	e<span style="color:#969896">.</span><span style="color:#795da3">printStackTrace</span><span style="color:#969896">(</span><span style="color:#969896">)</span><span style="color:#969896">;</span>
    <span style="color:#969896">}</span>
    </code></span>

     

    其中args是String[] { “python”,path,url1,url2 }; ,path是python程序所在的路径,url1是参数1,url2是参数2,以此类推
    最后结果如图所示:
    在这里插入图片描述
    OK,成功了。

    总结: 以上就是Java调用python程序的所有方法总结,推荐使用第三种方法,比前两种方便很多。最后,欢迎大家转载,转载请注明出处http://blog.csdn.net/it_xiao_bai/article/details/79074988

    展开全文
    qq_32649581 2018-12-29 12:50:43
  • 32.37MB weixin_36267209 2019-08-13 10:40:25
  • weixin_39972264 2020-11-21 01:38:36
  • weixin_32759777 2020-07-11 18:51:04
  • weixin_42307478 2021-03-13 21:06:36
  • qq_29883591 2018-09-02 16:47:55
  • weixin_33103961 2021-01-14 16:16:51
  • weixin_36198878 2021-03-10 08:20:19
  • weixin_43424932 2020-07-08 20:14:21
  • weixin_39860849 2020-11-11 14:51:07
  • weixin_42096620 2020-12-09 15:07:42

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 677,083
精华内容 270,833
关键字:

java调用python

python 订阅
java 订阅
友情链接: 2_zadacha_dinamika.rar