关于Java调用Python脚本的处理方式

关于Java调用Python脚本的处理方式

步骤及说明

众所周知,在软件开发中,有许多不同的编程语言可供选择,每种语言都有其独特的优点和用途。
本文主要记录日常需求关于java和python之间的直接调用方式等。有需要的朋友可以往下观看:

需求背景

目前公司内web端后台是用java来编写的,上周出现了新需求必须从web端页面输入再经过python脚本算法计算相关数据返回内容,最后由java后台做相关逻辑处理。最开始想用java重写相关算法和逻辑,最后感觉还是扩展性太差尤其是针对于数据清洗,路径处理,灵活写法等,最后还是采用了python做这块功能开发(尤其numpy,pandas等第三方库可以满足大多数场景)。查询了很多资料,基本上java调用python脚本只有以下两种方式:

1.直接调用

import java.io.IOException;

public class CallPythonScript {
    public static void main(String[] args) {
        String input = "hello world!";
        String pythonScriptPath = "/path/to/copy_input_to_file.py";

        try {
            // 调用Python脚本
            Process process = Runtime.getRuntime().exec("python " + pythonScriptPath + " " + input);

            // 等待脚本执行完成
            int exitCode = process.waitFor();

            // 检查脚本是否执行成功
            if (exitCode == 0) {
                System.out.println("执行成功!");
            } else {
                System.out.println("执行失败!");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

其中指定了Python脚本的路径和需要传递给脚本的输入字符串。然后,使用Runtime.getRuntime().exec方法在Java中调用该脚本。该方法将返回一个Process对象,该对象表示正在运行的Python进程。

还使用process.waitFor()方法等待脚本执行完成,并从该方法获取脚本的退出码。如果退出码为0,则表示该脚本成功执行。否则,可以在Java中处理错误。

2. Jpython调用

pom文件导jar包

<dependency>
  <groupId>org.python</groupId>
  <artifactId>jython-standalone</artifactId>
  <version>2.7.3</version>
</dependency>

导入jython库:

import org.python.util.PythonInterpreter;

创建Python解释器对象:

PythonInterpreter interpreter = new PythonInterpreter();

使用解释器对象执行Python脚本:

interpreter.execfile("path/to/python/script.py");

可以在代码中使用以下命令将Python脚本中的函数作为Java方法调用:

interpreter.exec("from my_python_module import my_python_function");
interpreter.exec("result = my_python_function()");
PyObject pyObject = interpreter.get("result");
Object javaObject = pyObject.__tojava__(Object.class);

最后使用以下命令关闭Python解释器:

interpreter.close();

亲测可以正常运行,但对于复杂逻辑和大量第三方库包则不行,因为jython虽然有基础的第三方库包,但有些第三方库还是没有的。
需要通过ProcessBuilder类或Runtime类来启动Python解释器,并在启动解释器时将第三方库的路径添加到PYTHONPATH环境变量中。例如:

ProcessBuilder pb = new ProcessBuilder("python", "my_script.py");
Map<String, String> env = pb.environment();
env.put("PYTHONPATH", "/path/to/my/library");
Process p = pb.start();

这种方式可以确保Python解释器在执行Python脚本时可以找到第三方库,但是需要启动一个新的Python解释器进程,开销较大。
又或者可以直接使用Jython的PythonInterpreter类,在程序内直接加载Python解释器,然后在解释器对象中使用Python的sys.path模块将第三方库的路径添加到Python解释器的搜索路径中。例如:

PythonInterpreter interpreter = new PythonInterpreter();
interpreter.exec("import sys");
interpreter.exec("sys.path.append('/path/to/my/library')");
interpreter.execfile("my_script.py");

在程序中直接加载Python解释器,添加第三方库的路径后执行Python脚本,避免了启动新的Python解释器进程,但是需要确保使用的第三方库与jython版本兼容。
以上两种方式都可以解决Python脚本中存在第三方库的问题,具体选择哪种方式需要根据具体情况进行判断。

注意:目前jpython的环境支持python2.7,3.8的环境博主测试过有些函数是无法直接运行的,需要做相关修改或处理。当然每个人实际情况不一样,希望可以帮助到各位。最后祝各位儿童节快乐~~

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

super超的代码日志

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

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

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

打赏作者

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

抵扣说明:

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

余额充值