赞
踩
原创博文,欢迎转载,转载时请务必附上博文链接,感谢您的尊重。
通过本篇,你将初步认识在Java程序中简单调用.py脚本文件的方法,附带入门的Demo实例讲解,更深入的理解还需要进一步学习。
最近有个Java项目,核心需求是要对庞大的采集数据进行分析汇总展示。算法这东西如果使用Java程序实现运算效率肯定不高,开发周期长,成本也比较大,所以考虑直接使用python运算,毕竟,这是python的一大优势。
这两种方法我都尝试过,个人推荐第二种方法,因为Python有时需要用到第三方库,比如requests,而Jython不支持。
所以本地安装Python环境并且安装第三库再用Java调用是最好的方法。
下面通过两个小例子,分别是不带参数和带参数的,展示如何使用Java调用Python脚本:
我们运行python脚本的时候,通常只需在命令行敲出“python xxx.py”就可以了。这里使用JAVA调用python的原理就是通过使用JAVA完成命令行操作。
- def hello():
- print('Hello,Python')
-
- if __name__ == '__main__':
- hello()
Java测试调用代码:
- import java.io.BufferedReader;
- import java.io.InputStreamReader;
-
- public class JcallPy {
-
- public static void main(String[] args) {
- String executer = "python";
- // python绝对路径
- String file_path = "E:\intellij idea\workspace\src\demo.py";
- String[] command_line = new String[] {executer, file_path};
- try {
- Process process = Runtime.getRuntime().exec(command_line);
- BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream(),"GBK"));
- String line;
- while ((line = in.readLine()) != null) {
- System.out.println(line);
- }
- in.close();
- // java代码中的 process.waitFor() 返回值(和我们通常意义上见到的0与1定义正好相反)
- // 返回值为0 - 表示调用python脚本成功;
- // 返回值为1 - 表示调用python脚本失败。
- int re = process.waitFor();
- System.out.println("调用 python 脚本是否成功:" + re);
- } catch (IOException e1) {
- e1.printStackTrace();
- } catch (InterruptedException e2) {
- e2.printStackTrace();
- }
- }
- }

上述程序实际上完成了一个“python xxx.py”的功能,然后把python的输出承接过来。结果如下:
- Hello,Python
- 调用 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文件的位置,使用绝对路径。
上述操作无法向python程序传递参数,如果需要传递参数则需要用python中的argv模块去承接参数,这样的场景更符合项目实际。
修改Python代码:
- # coding=utf-8
- from sys import argv
-
- a = argv[1]
- b = argv[2]
- res = int(a) + int(b)
- print(res)
这样就可以以“python xxx.py a b”这种形式来传递参数,修改JAVA代码如下:
Java测试调用代码:
- import java.io.BufferedReader;
- import java.io.InputStreamReader;
-
- public class JcallPy {
-
- public static void main(String[] args) {
- String executer = "python";
- // python绝对路径
- String file_path = "E:\intellij idea\workspace\src\demo.py";
- String num1 = "3";
- String num2 = "7";
- String[] command_line = new String[] {executer, file_path, num1, num2};
- try {
- Process process = Runtime.getRuntime().exec(command_line);
- BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream(),"GBK"));
- String line;
- while ((line = in.readLine()) != null) {
- System.out.println(line);
- }
- in.close();
- // java代码中的 process.waitFor() 返回值(和我们通常意义上见到的0与1定义正好相反)
- // 返回值为0 - 表示调用python脚本成功;
- // 返回值为1 - 表示调用python脚本失败。
- int re = process.waitFor();
- System.out.println("调用 python 脚本是否成功:" + re);
- } catch (IOException e1) {
- e1.printStackTrace();
- } catch (InterruptedException e2) {
- e2.printStackTrace();
- }
- }
- }

输出结果:
- 10
- 调用 python 脚本是否成功:0
我是「IT无知君」,您的点赞、评论和关注,是我创作的动力源泉。
学无止境,气有浩然,让我们一起加油,天涯未远,江湖有缘再见!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。