Java调用Python脚本
使用java.lang.Process类
Doc: 利用
ProcessBuilder.start()
和
Runtime.exec
方法创建本机进程并返回一个可用于控制该进程并获取有关该进程信息的进程子类实例。通过方法
getOutputStream
,
getInputStream\'和
getErrorStream`获取进程的输出流。
举例
-
无参数Python脚本:
# -*- coding: utf-8 -*-def Non_agr_func:print(\"java use python script\")
java程序调用:
//调用过程可能出现IOException,需要处理异常String cmd = \"python C:\\\\Users\\\\Non_arg_func.py\";Process process = Runtime.getRuntime().exec(cmd);BufferedReader stream = new BufferedReader(new InputStreamReader(process.getInputStream()));BufferedReader errorStream = new BufferedReader(new InputStreamReader(process.getErrorStream()));String contentLine;String errorLine;while ((contentLine = stream.readLine()) != null) {System.out.print(\"content:\"contentLine);}while ((errorLine = errorStream.readLine()) != null) {System.out.print(\"error:\"errorLine);}stream.close();
-
传参Python脚本
# -*- coding: utf-8 -*-import sysdef args_func(a, b):return a+bif __name__ = \'__main__\':args = []for i in rang(1, len(sys.argv)):args.append(int(sys.argv[i]))print(args_func(args[0], args[1]))# sys.argv[0]代表python程序名,所以列表从1开始读取参数
java程序调用:
//与无参Python脚本调用完全一致,只需要在命令中传入需要的参数//下面两种命令的写法都可以String command = String.format(\"python %s %s %s\", \"C:\\\\Users\\\\arg_func.py\", \"1\", \"2\");String[] args = new String[] {\"python\", \"C:\\\\Users\\\\arg_func.py\", \"1\", \"2\"};Process process = Runtime.getRuntime().exec(cmd);BufferedReader stream = new BufferedReader(new InputStreamReader(process.getInputStream()));String contentLine;while ((contentLine = stream.readLine()) != null) {System.out.print(\"content:\"contentLine);}
-
服务部署文档requirement.txt
程序终究是需要部署到服务器上的,而部署过程就需要引入我们的Python中用到的模块,因此需要添加一个
requirement.txt
文档,用于一键引入需要的模块。这里我们使用pipreqs工具来自动生成该文件
安装
pip install pipreqs
-
用法
#跟目录下使用命令pipreqs ./
-
报错
# Windows下报编码错误UnicodeDecodeError: \'gbk\' codec can\'t decode byte 0xa8 in position 24: illegal multibyte sequence# 解决方法:指定编码pipreqs ./ --encoding=utf8