Java执行Python脚本

7 篇文章 1 订阅

Java执行Python脚本

一、前言

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

  2. JDK版本:1.8

  3. 虚拟环境:Anaconda

  4. python 版本:3.6

二、正文

场景说明

  • 场景: 在 java 程序中执行 python 脚本,读取 python 的输出内容
  • 方法:
  1. Jython:Java 环境中执行 python 脚本
  2. Flask:python 环境中发布服务接口,然后 java 调用服务接口 (推荐)
  3. 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

说明:两种实现分别是 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<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

说明:

  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<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 丢失
  • 解决方法:
  1. 网上下载对应的 dll 文件,将文件添加到 C:\Windows\SysWOW64 (64 位操作系统)
  2. 如果还不行,将 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)
  • 解决方法:
  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
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

趴着喝可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值