使用Runtime.getRuntime()执行python脚本文件
在本地的D盘创建一个python脚本,文件名字为Runtime.py,文件内容如下:
print('RuntimeDemo')
注意:如果Python脚本里面有文件路径,则要进行转换,比如 ./ 指的是javaweb项目的当前项目路径,而不是Python脚本的当前路径。
创建RuntimeFunction.java类,内容如下:
1 package com.test;
2
3 import java.io.BufferedReader;
4 import java.io.IOException;
5 import java.io.InputStreamReader;
6
7 public class RuntimeFunction {
8 public static void main(String[] args) {
9 Process proc;
10 try {
11 proc = Runtime.getRuntime().exec("python D:\\Runtime.py");
12 BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
13 String line = null;
14 while ((line = in.readLine()) != null) {
15 System.out.println(line);
16 }
17 in.close();
18 proc.waitFor();
19 } catch (IOException e) {
20 e.printStackTrace();
21 } catch (InterruptedException e) {
22 e.printStackTrace();
23 }
24 }
25 }
运行结果如下:
调用python脚本中的函数
在本地的D盘创建一个python脚本,文件名字为add.py,文件内容如下:
def add(a,b):
return a + b
创建Function.java类,内容如下:
1 package com.test;
2
3 import org.python.core.PyFunction;
4 import org.python.core.PyInteger;
5 import org.python.core.PyObject;
6 import org.python.util.PythonInterpreter;
7
8 public class Function {
9
10 public static void main(String[] args) {
11 PythonInterpreter interpreter = new PythonInterpreter();
12 interpreter.execfile("D:\\add.py");
13
14 // 第一个参数为期望获得的函数(变量)的名字,第二个参数为期望返回的对象类型
15 PyFunction pyFunction = interpreter.get("add", PyFunction.class);
16 int a = 5, b = 10;
17 //调用函数,如果函数需要参数,在Java中必须先将参数转化为对应的“Python类型”
18 PyObject pyobj = pyFunction.__call__(new PyInteger(a), new PyInteger(b));
19 System.out.println("the anwser is: " + pyobj);
20 }
21
22 }
运行结果如下:
中文乱码问题解决
用Runtime.getRuntime.exec()调用Python脚本时,Java端捕获脚本有中文输出时,输出的中文可能会是乱码,因为Python安装在Windows环境下的默认编码格式是GBK。
解决方法:
在被调用的脚本的开头增加如下代码,一定要添加到其他依赖模块import之前:
import io
import sys
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
参考文章:
java调用python的几种用法(看这篇就够了)
Java利用Runtime调用Python脚本时的中文乱码问题