文章目录
Java执行Python脚本
一、前言
- 开发环境
-
操作系统:Windows 7 Ultimate
-
JDK版本:1.8
-
虚拟环境:Anaconda
-
python 版本:3.6
- python 官网:https://www.python.org/
- 北京外国语大学开源软件镜像站:https://mirrors.bfsu.edu.cn/help/anaconda/
- Microsoft Visual C++ 2015 RCRedistributable 下载:https://www.microsoft.com/zh-cn/download/details.aspx?id=48145
- ProcessBuilder class:https://docs.oracle.com/javase/8/docs/api/java/lang/ProcessBuilder.html
- Runtime class:https://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html
- jyphon 官网:https://www.jython.org/
- flask Github:https://github.com/pallets/flask
- Anacoda安装和使用:https://blog.csdn.net/u011424614/article/details/105579502
- flask 框架入门和使用实践:https://blog.csdn.net/u011424614/article/details/112548442
二、正文
场景说明
- 场景: 在 java 程序中执行 python 脚本,读取 python 的输出内容
- 方法:
- Jython:Java 环境中执行 python 脚本
- Flask:python 环境中发布服务接口,然后 java 调用服务接口 (推荐)
- Java 程序模拟命令行的交互环境执行 python 脚本 (当前文章使用的方法)
python脚本
- 创建
main_java.py
说明:根据传入参数,返回组装的 json 对象
# coding=utf-8
import json
from sys import argv
def assemble_data(id, name):
"""
组装数据
:return: result
"""
# 结果字典
result = {}
# 封装结果
result["id"] = id
result["name"] = name
return result
if __name__ == '__main__':
result = assemble_data(argv[1], argv[2])
# 输出 json 格式字符串
print(json.dumps(result))
java程序
- 创建工具类
CommandTask.java
说明:两种实现分别是
ProcessBuilder
和Runtime
package com.demo.util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;
/**
* 执行命令的任务工具
* */
public class CommandTask {
/**
* 执行命令( ProcessBuilder 实现 )
* @param command 命令列表
* @return String
* */
public static String exeuteByProcessBuilder(List<String> command) throws IOException, InterruptedException {
ProcessBuilder processBuilder = new ProcessBuilder(command);
Process process = processBuilder.start(); // 开始执行
// 字节流和字符流的中介
InputStreamReader inputStreamReader = new InputStreamReader(process.getInputStream());
BufferedReader bufferedReader = new BufferedReader(inputStreamReader); // 字符流
StringBuilder result = new StringBuilder(); // 结果数据
String line = "";
while ((line = bufferedReader.readLine()) != null){
// System.out.println( line ); // 打印内容
result.append(line);
}
// 关闭流
if(bufferedReader != null){ bufferedReader.close(); }
if(inputStreamReader != null){ inputStreamReader.close(); }
return result.toString();
}
/**
* 执行命令( Runtime 实现 )
* @param command 命令数组
* @return String
* */
public static String exeuteByRuntime(String [] command) throws IOException, InterruptedException {
// 执行命令
Process process = Runtime.getRuntime().exec(command);
// 读取内容
BufferedReader bufferedReader
= new BufferedReader(new InputStreamReader(process.getInputStream()));
StringBuilder result = new StringBuilder(); // 结果数据
String line= "";
while ((line = bufferedReader.readLine()) != null){
// System.out.println(line); // 打印内容
result.append(line);
}
// 关闭流
bufferedReader.close();
return result.toString();
}
}
- 测试类
CommandTaskTest.java
说明:
如果启动参数配置了 python 的环境变量,可以将
E:\\Anaconda3\\envs\\python36\\python.exe
简写为python
fastjson 可以解决中文
Unicode
编码的问题
package com.demo.util;
import com.alibaba.fastjson.JSONObject;
import org.junit.Test;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
public class CommandTaskTest {
@Test
public void exeuteByProcessBuilder() throws IOException, InterruptedException {
// 参数
List<String> command = Arrays.asList(
"E:\\Anaconda3\\envs\\python36\\python.exe"
, "E:\\python_project\\main_java.py"
, "1001", "小明同学"
);
// 执行
String content = CommandTask.exeuteByProcessBuilder(command);
System.out.println(JSONObject.parse(content));
}
@Test
public void exeuteByRuntime() throws IOException, InterruptedException {
// 参数
String [] command = new String[]{
"E:\\Anaconda3\\envs\\python36\\python.exe"
, "E:\\python_project\\main_java.py"
, "1001", "小明同学"
};
// 执行
String content = CommandTask.exeuteByRuntime(command);
System.out.println(JSONObject.parse(content));
}
}
三、其它
1.Python环境无法使用pip安装模块
- 场景说明:在 python.org 下载并安装 python 环境后,无法使用 pip 安装第三方模块
- 解决方法:配置 pip 管理工具
> python -m ensurepip
> python -m pip install --upgrade pip --force-reinstall
2.设置镜像源
北京外国语大学开源软件镜像站:https://mirrors.bfsu.edu.cn/help/anaconda/
- 场景说明:下载第三方模块时,下载速度慢
- 解决方法:配置国内镜像源
pip install -i https://mirrors.bfsu.edu.cn/pypi/web/simple pip -U
pip config set global.index-url https://mirrors.bfsu.edu.cn/pypi/web/simple
3.报错:dll文件丢失
- 场景说明:在运行 python 指令时,出现提示:
api-ms-win-crt-runtimel1-1-0.dll
丢失 - 解决方法:
- 网上下载对应的 dll 文件,将文件添加到
C:\Windows\SysWOW64
(64 位操作系统) - 如果还不行,将
C:\Windows\SysWOW64
配置到系统环境变量中
4.报错:python.exe应用程序无法正常启动
Microsoft Visual C++ 2015 RCRedistributable 下载:https://www.microsoft.com/zh-cn/download/details.aspx?id=48145
- 场景说明:在运行 python 指令时,出现提示:
python.exe应用程序无法正常启动(Oxc000007b)
- 解决方法:
- (未能解决错误)使用 DirectX 修复工具进行修复,并在修复后重启计算机
- (可以解决错误)下载并安装
Microsoft Visual C++ 2015 RCRedistributable (x64)
5.报错:安装opencv后无法使用
- 场景说明:安装 opencv 后,运行
import cv2
时,出现提示:ImportError: DLL load failed: %1 不是有效的 Win32 应用程序
- 解决方法:降版本
> pip install opencv-python==3.3.0.9