Java调用包含第三方库的Python脚本


使用了idea和Anaconda

python环境变量配置

Anaconda在安装时不推荐配置环境变量,如果安装时没有配置,要在Path中添加“D:\Anaconda3”。
配置后在cmd中输入“python”,即显示python版本信息。

运行时可能会出现的错误

1.Cannot run program “python”: CreateProcess error=2。
2.不报错,但控制台一直不回传结果。使用process.waitFor(),输出结果是1。(java代码中的process.waitFor()返回值为0表示我们调用python脚本成功,返回值为1表示调用python脚本失败)

第一个错误是因为没有在idea中配置python的环境变量,jvm找不到python的编译环境,所以无法编译执行相关py文件。
第二个错误是因为python脚本中引用了第三方库,因为找不到相应库文件,无法将python代码编译执行。
上述两个错误都需要在idea中配置环境变量。
配置环境变量如下:
1.找到Edit Configuration在这里插入图片描述

或者
在这里插入图片描述
2.在Environment variables中添加Path:D:\Anaconda3;D:\Anaconda3\Library\mingw-w64\bin;D:\Anaconda3\Library\usr\bin;D:\Anaconda3\Library\bin;D:\Anaconda3\Scripts;
在这里插入图片描述
如果没有引用第三方库,执行要配置“D:\Anaconda3”。
注意变量之间用分号‘;’隔开,千万不能有空格,否则不生效

引用第三方库的Java调用方法

不推荐使用Jpython,因为该包下能调用的python库不是很多,如果引用的库不在其中,会报java ImportError: No module named xxx。
推荐使用Runtime.getRuntime()执行脚本文件,具体代码如下:

/*第一个参数,如果没有配置环境变量,可用绝对路径代替(D:\\Anaconda3\\python),但不
能使用第三方库
filePath是python脚本路径,parameter是需要传入的参数
*/
String[] s = new String[]{"python", filePath, parameter1, parameter1};
try {
Process process = Runtime.getRuntime().exec(s);
//正常情况下,输出结果
InputStream inputStream = process.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "gbk"));
//“gbk”防止中文乱码

String line = null;
while ((line = reader.readLine()) != null){
System.out.println(line);
}
reader.close();

//java代码中的process.waitFor()返回值为0表示我们调用python脚本成功,
//返回值为1表示调用python脚本失败
System.out.println(process.waitFor());
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}

上面代码可完成java调用python脚本的全部过程,但如果脚本有错误,不会返回任何错误信息,需要下面代码查看

InputStream errorStream = process.getErrorStream();
BufferedReader error = new BufferedReader(new InputStreamReader(errorStream, "gbk"));

String line = null;
while ((line = error.readLine()) != null){
System.out.println(line);
}
error.close();

最后补充一个python脚本的测试用例

def add(a,b):
    return a + b
if __name__ == '__main__':
    args = []
    for i in range(1, len(sys.argv)):
        args.append((int(sys.argv[i])))
    result = add(args[0], args[1])
    print('加法的结果为' + str(result))
    
    #add(int(sys.argv[1]), int(sys.argv[2]))

猜你喜欢

转载自blog.csdn.net/weixin_48289706/article/details/107772715