ubuntu下使用java调用python文件

本文讲述了在Ubuntu系统中,使用Java的getRuntime()方法执行Python脚本遇到的问题及解决过程。问题在于Python第三方包cv2导入失败,最终发现是由于编码问题导致。解决方案是在Python文件第一行添加#encoding:utf-8,以适应不同的系统编码要求。同时,提供了完整的Java代码示例来正确调用Anaconda虚拟环境中的Python脚本。
摘要由CSDN通过智能技术生成

问题:

之前在Ubuntu系统下使用java的getRuntime()方法执行python脚本可以正常运行,今天突然无法运行,也没有任何报错。
参考:
Java调用Python脚本无法得到运行结果
JAVA 调PYTHON 文件(使用ANACONDA的环境)
waitFor()的结果为1表示执行出错,结果为0表示执行成功。

System.out.println(proc.waitFor());

下面这段代码可以打印出错误流,这样就可以看到再执行python文件时是哪里出错了。

InputStream errorStream = proc.getErrorStream();
BufferedReader error = new BufferedReader(new InputStreamReader(errorStream,"gbk"));
String lineError = null;
while ((lineError = error.readLine()) != null){
    System.out.println(lineError);
}
error.close();

查看错误流之后是因为第三方包cv2没导入成功,
查了很多博客都没解决问题,最后误打误撞发现竟然是要在python文件第一行添加#encoding:utf-8-_-||,尴尬。。应该是windows系统与ubuntu系统对编码的要求不同
最后附上ubuntu系统可执行annconda虚拟环境下python文件的代码

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class CmdTest {
    public static void main(String[] args) {
        CmdTest cmdTest = new CmdTest();
        ArrayList<String> cmdList = new ArrayList<>();
//        cmdList.add("cd /home/dengjie/anaconda3/bin");
//        cmdList.add("conda env list");
//        cmdList.add("conda activate pytorch");
        cmdList.add("/home/anaconda3/envs/pytorch/bin/python /home/Paper/detection/PyTorch-YOLOv3/detect.py");
//        cmdList.add("ls");
        List<String> list = cmdTest.executeCMD(cmdList);
    }


    public List<String> executeCMD(List<String> commands) {
        List<String> res = new ArrayList<>();
        Runtime run = Runtime.getRuntime();
        try {
            Process proc = run.exec("/bin/bash", null, null);
            BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
            PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true);
            for (String line : commands) {
                out.println(line);
            }
            out.println("exit");
            String rspline = "";
            while ((rspline = in.readLine()) != null) {
                System.out.println(rspline);
                res.add(rspline);
            }

            //打印错误信息
            InputStream errorStream = proc.getErrorStream();
            BufferedReader error = new BufferedReader(new InputStreamReader(errorStream,"gbk"));
            String lineError = null;
            while ((lineError = error.readLine()) != null){
                System.out.println(lineError);
            }
            error.close();

            //waitFor()为0时表示执行成功,为1时执行失败
            System.out.println(proc.waitFor());
            in.close();
            out.close();
            proc.destroy();
        } catch (InterruptedException | IOException e) {
            e.printStackTrace();
        }
        return res;
    }
}

列上参考博客:
Java调用Python程序方法总结(最全最详细)
JAVA 调PYTHON 文件(使用ANACONDA的环境)
java调用python的惨痛史(无法获取环境变量)
java调用python,引入第三方包报错no module named
java调用python程序
Java调用包含第三方库的Python脚本
java调用python过程中解决python第三方库问题
Java调用Python脚本无法得到运行结果
Java 调用 Python 没反应
ubuntu查看python及安装包的位置
JAVA使用Runtime.getRuntime()执行python脚本文件

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值