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 Springboot对接开发微信支付详细流程

    java Springboot对接开发微信支付详细流程

    最近要做一个微信小程序,需要微信支付,所以研究了下怎么在java上集成微信支付功能,下面这篇文章主要给大家介绍了关于java Springboot对接开发微信支付的相关资料,需要的朋友可以参考下
    2024-08-08
  • 解决SpringBoot搭建MyBatisPlus中selectList遇到LambdaQueryWrapper报错问题

    解决SpringBoot搭建MyBatisPlus中selectList遇到LambdaQueryWrapper报错问题

    这篇文章主要介绍了解决SpringBoot搭建MyBatisPlus中selectList遇到LambdaQueryWrapper报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • 小议Java中@param注解与@see注解的作用

    小议Java中@param注解与@see注解的作用

    这篇文章主要介绍了Java中@param注解与@see注解的作用,注解的功能类似于通常代码中的注释,需要的朋友可以参考下
    2015-12-12
  • 详解如何获取java中类的所有对象实例

    详解如何获取java中类的所有对象实例

    如何在运行时获取一个Java类的所有对象实例呢,本文给大家介绍一种底层实现的方式,基于jvmti,代码用C++实现,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-10-10
  • MyBatis 中 ${}和 #{}的正确使用方法(千万不要乱用)

    MyBatis 中 ${}和 #{}的正确使用方法(千万不要乱用)

    这篇文章主要介绍了MyBatis 中 ${}和 #{}的正确使用方法,本文给大家提到了MyBatis 中 ${}和 #{}的区别,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Mybatis分页查询的实现(Rowbounds和PageHelper)

    Mybatis分页查询的实现(Rowbounds和PageHelper)

    本文主要介绍了Mybatis分页查询的实现(Rowbounds和PageHelper),文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • SpringCache的基本使用方法

    SpringCache的基本使用方法

    Spring Cache利用了AOP,实现了基于注解的缓存功能,并且进行了合理的抽象,业务代码不用关心底层是使用了什么缓存框架,只需要简单地加一个注解,就能实现缓存功能了,本文介绍SpringCache的基本使用方法,感兴趣的朋友一起看看吧
    2024-01-01
  • 如何在32位Windows系统下安装Java

    如何在32位Windows系统下安装Java

    这篇文章主要介绍了如何在32位Windows系统下安装Java,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • 浅析springboot通过面向接口编程对控制反转IOC的理解

    浅析springboot通过面向接口编程对控制反转IOC的理解

    这篇文章主要介绍了springboot通过面向接口编程对控制反转IOC的理解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-08-08
  • SpringCloud Eureka服务发现实现过程

    SpringCloud Eureka服务发现实现过程

    这篇文章主要介绍了SpringCloud Eureka服务发现实现过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11

最新评论