遇到困难的第一天!
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函数/脚本
即便只是调用一个函数,也必须先加载整个 .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的优点
本地调用可以运行包含第三方模块的脚本,因为本地有环境。
目前选用的本地调用,后续出现问题还会更新。
项目
Xkfx’s Blog ,这是在博客园找到的一个博主,该博主上面附一个完整的手写数字识别的小项目,实测好用。
文章链接
项目链接
文章中有对项目使用的一些简单说明,感兴趣的话可以去链接地址查看。
大致过程:
经过对手写数字识别项目的学习,后续实现的Java调用Python实现的分类算法(基于深度学习)。可正常运行,但是还有一些小问题。
1.调用时Python实现的算法中的数据、网络模型等的地址都要写绝对地址,相对地址会出现问题(现在在做其他部分,后续对该部分有解决办法的话会更新);
2.基于深度学习的算法,输出时由于有警告之类的问题,无法直接获取控制台的输出,因此需在Python代码中将结果输出到文件中。
分类算法只运行测试了训练部分,因此没有添加项目地址,若有需要的请留言联系。