当前位置:   article > 正文

如何在Java程序中调用Python算法脚本,重点讲Demo,不墨迹理论_java进入python环境,from platenumocr import demo

java进入python环境,from platenumocr import demo

原创博文,欢迎转载,转载时请务必附上博文链接,感谢您的尊重。

前言

通过本篇,你将初步认识在Java程序中简单调用.py脚本文件的方法,附带入门的Demo实例讲解,更深入的理解还需要进一步学习。

最近有个Java项目,核心需求是要对庞大的采集数据进行分析汇总展示。算法这东西如果使用Java程序实现运算效率肯定不高,开发周期长,成本也比较大,所以考虑直接使用python运算,毕竟,这是python的一大优势。


正文

一、常见的java调用python脚本方式

  • 通过Jython.jar提供的类库实现;
  • 通过Runtime.getRuntime()开启进程来执行脚本文件;

这两种方法我都尝试过,个人推荐第二种方法,因为Python有时需要用到第三方库,比如requests,而Jython不支持。

所以本地安装Python环境并且安装第三库再用Java调用是最好的方法。

下面通过两个小例子,分别是不带参数和带参数的,展示如何使用Java调用Python脚本:

二、通过Runtime调用python脚本

我们运行python脚本的时候,通常只需在命令行敲出“python  xxx.py”就可以了。这里使用JAVA调用python的原理就是通过使用JAVA完成命令行操作。

1. 简单的python调用:

  1. def hello():
  2. print('Hello,Python')
  3. if __name__ == '__main__':
  4. hello()

Java测试调用代码:

  1. import java.io.BufferedReader;
  2. import java.io.InputStreamReader;
  3. public class JcallPy {
  4. public static void main(String[] args) {
  5. String executer = "python";
  6. // python绝对路径
  7. String file_path = "E:\intellij idea\workspace\src\demo.py";
  8. String[] command_line = new String[] {executer, file_path};
  9. try {
  10. Process process = Runtime.getRuntime().exec(command_line);
  11. BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream(),"GBK"));
  12. String line;
  13. while ((line = in.readLine()) != null) {
  14. System.out.println(line);
  15. }
  16. in.close();
  17. // java代码中的 process.waitFor() 返回值(和我们通常意义上见到的0与1定义正好相反)
  18. // 返回值为0 - 表示调用python脚本成功;
  19. // 返回值为1 - 表示调用python脚本失败。
  20. int re = process.waitFor();
  21. System.out.println("调用 python 脚本是否成功:" + re);
  22. } catch (IOException e1) {
  23. e1.printStackTrace();
  24. } catch (InterruptedException e2) {
  25. e2.printStackTrace();
  26. }
  27. }
  28. }

上述程序实际上完成了一个“python xxx.py”的功能,然后把python的输出承接过来。结果如下:

  1. Hello,Python
  2. 调用 python 脚本是否成功:0

重点:

1. BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream(),"GBK"));

这段代码中的GBK是为了防止Python输出中文时乱码加的。

2.  String[] command_line = new String[] {executer, file_path}; 

这句代码是很重要的,首先一定要设置好你所使用的python的位置,切记不要直接使用python,因为系统会默认使用自带的python,所以一定要设置好你所使用的python的位置,否则可能会出现意想不到的问题。

比如说我使用的是anaconda中的python,而ubuntu系统会默认调用自带的python,而我自带的python中并没有numpy库,所以会造成相应的代码不会执行的问题,所以设置好python的位置是很重要的。

还有就是要设置好py文件的位置,使用绝对路径。

2. 带参数的python调用

上述操作无法向python程序传递参数,如果需要传递参数则需要用python中的argv模块去承接参数,这样的场景更符合项目实际。

修改Python代码:

  1. # coding=utf-8
  2. from sys import argv
  3. a = argv[1]
  4. b = argv[2]
  5. res = int(a) + int(b)
  6. print(res)

这样就可以以“python xxx.py a b”这种形式来传递参数,修改JAVA代码如下: 

Java测试调用代码:

  1. import java.io.BufferedReader;
  2. import java.io.InputStreamReader;
  3. public class JcallPy {
  4. public static void main(String[] args) {
  5. String executer = "python";
  6. // python绝对路径
  7. String file_path = "E:\intellij idea\workspace\src\demo.py";
  8. String num1 = "3";
  9. String num2 = "7";
  10. String[] command_line = new String[] {executer, file_path, num1, num2};
  11. try {
  12. Process process = Runtime.getRuntime().exec(command_line);
  13. BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream(),"GBK"));
  14. String line;
  15. while ((line = in.readLine()) != null) {
  16. System.out.println(line);
  17. }
  18. in.close();
  19. // java代码中的 process.waitFor() 返回值(和我们通常意义上见到的0与1定义正好相反)
  20. // 返回值为0 - 表示调用python脚本成功;
  21. // 返回值为1 - 表示调用python脚本失败。
  22. int re = process.waitFor();
  23. System.out.println("调用 python 脚本是否成功:" + re);
  24. } catch (IOException e1) {
  25. e1.printStackTrace();
  26. } catch (InterruptedException e2) {
  27. e2.printStackTrace();
  28. }
  29. }
  30. }

输出结果:

  1. 10
  2. 调用 python 脚本是否成功:0

总结

  1. JAVA调用Python可以通过runtime,可以完成参数的传递,运行结果的传递;
  2. 传递的数据对JAVA来讲都是二进制流,需要整理成所需的数据格式;
  3. 传递的数据对于Python来讲,都是字符串,也需要调整成所需的数据格式;
  4. 当传输数据为图像或者矩阵等复杂数据格式时,要适当修改两种语言的传递接口。

我是IT无知君,您的点赞、评论和关注,是我创作的动力源泉。
学无止境,气有浩然,让我们一起加油,天涯未远,江湖有缘再见!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/539471
推荐阅读
相关标签
  

闽ICP备14008679号