Linux环境下Java调用Python脚本的常见问题解决

 更新时间:2025年06月10日 09:26:43   作者:天河归来  
做一个项目,需要使用java调用Python脚本,从开始各种错误到最后调用成功,所以这篇文章就来记录一下,有需要的小伙伴可以参考一下

基本操作

1. 基本命令

首先在Linux系统下,使用Java调用Python脚本,传入参数,需要使用Runtime.exec()方法,即在java中使用shell命令,这个方法有两种使用形式:

  • 无参数传入,直接执行Linux相关命令:Process pr = Runtime.getRuntime().exec(String cmd);
  • 有参数传入,并执行Linux命令:Process pr = Runtime.getRuntime().exec(String[] cmd);
  • 无参数可以直接传入字符串,如果需要传参数,就要用2的字符串数组实现。

2. 执行结果

使用exec方法执行命令,如果需要执行的结果,用如下方式得到:

    String line;
    while ((line = input.readLine()) != null) {
        System.out.println(line);
         if ("".equals(line)) {
               break;
          }
    }
    System.out.println("line------------------>" + line);

3. 查看运行错误信息

可以用以下方式查看运行的错误信息:

    BufferedReader errorResultReader = new BufferedReader(new InputStreamReader(pr.getErrorStream()));
    String errorLine;
    while ((errorLine = shellErrorResultReader.readLine()) != null) {
        System.out.println("errorStream:" + errorLine);
    }
    int exitCode = pr.waitFor();
    System.out.println("exitCode:" + exitCode);

4. 简单示例

当然exec还有很多本文未说明的方法,本文目前只需要以上几个方法进行定位,尤其是3。

举一个简单的例子,使用Java调用Linux的pwd命令,得到当前所在目录:

    String result = "";
    String cmd = "pwd";
    Process pr = Runtime.getRuntime().exec(cmd);
    InputStreamReader ir = new InputStreamReader(pr.getInputStream());
    LineNumberReader input = new LineNumberReader(ir);
    result = input.readLine();
    System.out.println("result:" + result);

问题汇总

1. 安装Python环境

运行Python会需要Python环境,和很多Python的库,如果没有就会报错。首先安装Python环境,我安装的是Python3.8,这个有很多教程,就不具体说了。就是下载对应版本的安装包,上传到服务器,进行安装。输入:

python -V

能够正常显示出当前python的版本号,就是安装成功了。

2. 缺少Python库

折腾完Python环境,再次运行Python脚本,发现还报错,可以用上文中查看错误信息的方法看到Java调用时的错误信息,提示缺少XXX库,这个错误提示就非常明确了,安装就完了,不过安装过程也非常曲折,我的是缺少dlib库,就是和人脸相关的,这个网上也有很多教程,我的安装过程是:首先安装了miniconda,然后用conda安装cmake和boost,然后安装dlib就成功了。

3. 运行时报错

Python安装完,各种库也安装完了,而且在Linux直接调用Python脚本已经运行成功,这时候正常应该没什么问题了,直接使用Java代码调用就可以了,使用如下代码:

    String result = "";
    String[] cmd = {"python", "/home/test.py"};
    Process pr = Runtime.getRuntime().exec(cmd);
    InputStreamReader ir = new InputStreamReader(pr.getInputStream());
    LineNumberReader input = new LineNumberReader(ir);
    result = input.readLine();
    System.out.println("result:" + result);

依旧报错,找不到库,不应该啊,我在Linux环境直接用shell窗口都可以运行了,说明Linux下的环境和脚本应该都没有问题,还是Java调用的问题。经过我不断尝试和百度,发现了如下解决方案:

在Java调用Python时,需要指定Python的目录,使用如下命令:

which python

查看python使用的路径,然后在Java调用的时候写出绝对路径:

String[] cmd = {"/root/miniconda3/bin/python", "/home/test.py"};

到此问题解决。

到此这篇关于Linux环境下Java调用Python脚本的常见问题解决的文章就介绍到这了,更多相关Java调用Python脚本内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java实现断点下载功能的示例代码

    Java实现断点下载功能的示例代码

    当下载一个很大的文件时,如果下载到一半暂停,如果继续下载呢?断点下载就是解决这个问题的。本文将用Java语言实现断点下载,需要的可以参考一下
    2022-05-05
  • Java集合定义与用法实例总结【Set、List与Map】

    Java集合定义与用法实例总结【Set、List与Map】

    这篇文章主要介绍了Java集合定义与用法,结合实例形式总结分析了Java集合中Set、List和Map相关概念、功能、用法及操作注意事项,需要的朋友可以参考下
    2018-08-08
  • Java程序快速合并多个Word(docx)文档

    Java程序快速合并多个Word(docx)文档

    这篇文章主要为大家介绍了如何使用Java程序快速合并多个Word(docx)文档实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • 图文并茂讲解RocketMQ消息类别

    图文并茂讲解RocketMQ消息类别

    这篇文章主要介绍了图文并茂讲解RocketMQ消息类别,RocketMQ对于消息提供了很多用法,包括:同步消息、异步消息、单向发送、顺序消息、延时消息、批量消息、过滤消息、事务消息等
    2022-12-12
  • SpringBoot声明式事务的简单运用说明

    SpringBoot声明式事务的简单运用说明

    这篇文章主要介绍了SpringBoot声明式事务的简单运用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • springboot中request和response的加解密实现代码

    springboot中request和response的加解密实现代码

    这篇文章主要介绍了springboot中request和response的加解密实现,在springboot中提供了RequestBodyAdviceAdapter和ResponseBodyAdvice,利用这两个工具可以非常方便的对请求和响应进行预处理,需要的朋友可以参考下
    2022-06-06
  • JAXB命名空间_动力节点Java学院整理

    JAXB命名空间_动力节点Java学院整理

    这篇文章主要为大家详细介绍了JAXB命名空间的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • 一文带你深入了解Java String的不可变性

    一文带你深入了解Java String的不可变性

    这篇文章主要来和大家一起深入探讨一下Java String中的不可变性,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-06-06
  • Java @GlobalLock注解详细分析讲解

    Java @GlobalLock注解详细分析讲解

    这篇文章主要介绍了Java @GlobalLock注解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-11-11
  • Java可执行JAR包打包三种方式完全解析

    Java可执行JAR包打包三种方式完全解析

    在Java开发中我们经常使用JAR文件来打包应用程序及其依赖,这个过程涉及到许多细节,尤其是在项目中包含其他JAR文件时,这篇文章主要介绍了Java可执行JAR包打包三种方式完全解析的相关资料,需要的朋友可以参考下
    2026-05-05

最新评论