博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java执行Python脚本
阅读量:4298 次
发布时间:2019-05-27

本文共 4910 字,大约阅读时间需要 16 分钟。

文章目录

Java执行Python脚本

一、前言

  • 开发环境
  1. 操作系统:Windows 7 Ultimate

  2. JDK版本:1.8

  3. 虚拟环境:Anaconda

  4. python 版本:3.6

  • python 官网:
  • 北京外国语大学开源软件镜像站:
  • Microsoft Visual C++ 2015 RCRedistributable 下载:
  • ProcessBuilder class:
  • Runtime class:
  • jyphon 官网:
  • flask Github:
  • Anacoda安装和使用:
  • flask 框架入门和使用实践:

二、正文

场景说明

  • 场景: 在 java 程序中执行 python 脚本,读取 python 的输出内容
  • 方法:
  1. Jython:Java 环境中执行 python 脚本
  2. Flask:python 环境中发布服务接口,然后 java 调用服务接口 (推荐)
  3. Java 程序模拟命令行的交互环境执行 python 脚本 (当前文章使用的方法)

python脚本

  • 创建 main_java.py

说明:根据传入参数,返回组装的 json 对象

# coding=utf-8import jsonfrom sys import argvdef assemble_data(id, name):    """    组装数据    :return: result    """    # 结果字典    result = {
} # 封装结果 result["id"] = id result["name"] = name return resultif __name__ == '__main__': result = assemble_data(argv[1], argv[2]) # 输出 json 格式字符串 print(json.dumps(result))

java程序

  • 创建工具类 CommandTask.java

说明:两种实现分别是 ProcessBuilderRuntime

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
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

说明:

  1. 如果启动参数配置了 python 的环境变量,可以将 E:\\Anaconda3\\envs\\python36\\python.exe 简写为 python

  2. 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
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.设置镜像源

北京外国语大学开源软件镜像站:

  • 场景说明:下载第三方模块时,下载速度慢
  • 解决方法:配置国内镜像源
pip install -i https://mirrors.bfsu.edu.cn/pypi/web/simple pip -Upip config set global.index-url https://mirrors.bfsu.edu.cn/pypi/web/simple

3.报错:dll文件丢失

  • 场景说明:在运行 python 指令时,出现提示: api-ms-win-crt-runtimel1-1-0.dll 丢失
  • 解决方法:
  1. 网上下载对应的 dll 文件,将文件添加到 C:\Windows\SysWOW64 (64 位操作系统)
  2. 如果还不行,将 C:\Windows\SysWOW64 配置到系统环境变量中

4.报错:python.exe应用程序无法正常启动

Microsoft Visual C++ 2015 RCRedistributable 下载:

  • 场景说明:在运行 python 指令时,出现提示:python.exe应用程序无法正常启动(Oxc000007b)
  • 解决方法:
  1. (未能解决错误)使用 DirectX 修复工具进行修复,并在修复后重启计算机
  2. (可以解决错误)下载并安装 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

转载地址:http://hznws.baihongyu.com/

你可能感兴趣的文章
查看linux核心数
查看>>
数据结构与算法三: 数组
查看>>
Activiti工作流会签二 启动流程
查看>>
Activiti工作流会签三 撤销,审批,驳回
查看>>
Oauth2方式实现单点登录
查看>>
CountDownLatch源码解析加流程图详解--AQS类注释翻译
查看>>
ES相关度评分
查看>>
我们一起做一个可以商用的springboot脚手架
查看>>
idea在搭建ssm框架时mybatis整合问题 无法找到mapper
查看>>
java设计基本原则----单一职责原则
查看>>
HashMap的实现
查看>>
互斥锁 synchronized分析
查看>>
java等待-通知机制 synchronized和waity()的使用实践
查看>>
win10 Docke安装mysql8.0
查看>>
docker 启动已经停止的容器
查看>>
order by 排序原理及性能优化
查看>>
Lock重入锁
查看>>
docker安装 rabbitMq
查看>>
git 常用命令 入门
查看>>
linux安装docker
查看>>