Java调用Python (2020-12-2)

Java调用Python的问题

由于毕设要做的项目设计到用Java调用执行Python的问题,因此在网上进行了一些搜索,在搜索的基础上加上我自己的理解,写出这篇博客,如有不允许的地方请联系我进行删除修改。

接下来的介绍,按照组会汇报时的内容进行。 (为什么,是什么,怎么做

为什么?

为什么使用Java调用Python

是什么?

 这个问题针对Jython

Jython是一种完整的语言,而不是一个Java翻译器或仅仅是一个Python编译器,它是一个Python语言在Java中的完全实现。Jython不仅提供了Python的库,同时也提供了所有的Java类。这使其有一个巨大的资源库。

怎么做?

这个在上面的截图中也有体现了,我目前发现的是3种。
第一种: 这个有点跑题,就是直接用Python完成项目的所有内容,从网站的搭建,到深度学习算法的实现,就没有Java调用Python的问题了。
第二种: 使用Jython。
第三种: Java直接对Python代码进行本地调用。

接下来对后两种分别进行一下展示。

使用Jython调用

要使用Jython,有两种办法。
一: 下载Jython,按步骤安装,然后将Jython-x.x.x.jar文件置于classpath中,在导入项目即可。附Jython下载地址。 官网下载

二: 通过maven导入

<dependency>
    <groupId>org.python</groupId>
    <artifactId>jython-standalone</artifactId>
    <version>2.7.0</version>
</dependency>
Jython目前最高版本是2.7.,最后的更新时间是2017年,虽然开发者表明会有3.版本,但是什么时候开发出来还不确定。emmm开发大佬还是比较任性的。

使用:
1.通过Jython执行Python语句

        PythonInterpreter interp = new PythonInterpreter();
        System.out.println("Hello, brave new world");
//        interp.exec("import numpy");
//        interp.exec("print numpy");
        interp.exec("import sys");
        interp.exec("print sys");
        interp.set("a", new PyInteger(42));
        interp.exec("print a");
        interp.exec("x = 2+2");
        PyObject x = interp.get("x");
        System.out.println("x: "+x);
        System.out.println("Goodbye, cruel world!");

结果
2.通过Jython调用Python函数/脚本
调用Python函数
即便只是调用一个函数,也必须先加载整个 .py文件,之后才能通过Jython包中所定义的类获取、调用这个函数。

Java直接对Python代码进行本地调用。

 public static void execPy() {
        Process proc = null;
          String PY_URL ="C:/Users/Administrator/Desktop/test3.py";
        try {
            proc = Runtime.getRuntime().exec("python " + PY_URL);
//            //用输入输出流来截取结果
           // 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();
        }
    }

test3.py:

import numpy as np 
from matplotlib import pyplot as plt 
 
x = np.arange(1,11) 
y =  2  * x +  5 
plt.title("Matplotlib demo") 
plt.xlabel("x axis caption") 
plt.ylabel("y axis caption") 
plt.plot(x,y) 
plt.show()


测试

Jython和本地调用对比

Jython优点

Jython优点

本地调用相对Jython的优点

本地调用

本地调用可以运行包含第三方模块的脚本,因为本地有环境。
目前选用的本地调用,后续出现问题还会更新。

项目

Xkfx’s Blog ,这是在博客园找到的一个博主,该博主上面附一个完整的手写数字识别的小项目,实测好用。
文章链接
项目链接
文章中有对项目使用的一些简单说明,感兴趣的话可以去链接地址查看。
大致过程:
大致

经过对手写数字识别项目的学习,后续实现的Java调用Python实现的分类算法(基于深度学习)。可正常运行,但是还有一些小问题。

1.调用时Python实现的算法中的数据、网络模型等的地址都要写绝对地址,相对地址会出现问题(现在在做其他部分,后续对该部分有解决办法的话会更新);
2.基于深度学习的算法,输出时由于有警告之类的问题,无法直接获取控制台的输出,因此需在Python代码中将结果输出到文件中。

分类算法只运行测试了训练部分,因此没有添加项目地址,若有需要的请留言联系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值