java调用python脚本返回的参数_javaweb调用python

java调用python脚本返回的参数_javaweb调用python实际工程项目中可能会用到Java和python两种语言结合进行,这样就会涉及到一个问题,就是怎么用Java程序来调用已经写好的python脚本呢,一共有四种方法可以实现:1、在java类中直接执行python语句此方法需要引用org.python包,需要下载Jpython。Jython是一种完整的语言,而不是一个Java翻译器或仅仅是一个Python编译器,它是一个Python语言在Java中的完全实现。Jython是在JVM上实现的Python,由J

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

实际工程项目中可能会用到 Java 和 python 两种语言结合进行,这样就会涉及到一个问题,就是怎么用 Java 程序来调用已经写好的 python 脚本呢,一共有四种方法可以实现:
在这里插入图片描述

1、在 java 类中直接执行 python 语句

此方法需要引用 org.python包,需要下载Jpython。

Jython 是一种完整的语言,而不是一个Java翻译器或仅仅是一个Python编译器,它是一个 Python 语言在 Java 中的完全实现。Jython 是在 JVM 上实现的 Python,由 Java 编写。Jython 将 Python 源码编译成JVM字节码,由 JVM 执行对应的字节码。因此能很好的与JVM集成,比如利用JVM的垃圾回收和JIT,直接导入并调用JVM上其他语言编写的库和函数。
既然 Jython 是 Python 语言在 Java 平台的实现,是 Java 语言实现的,那么可以在 Jython 程序中调用Java,也能在 Java 中调用 Jython
Jython 也有很多从 CPython 中继承的模块库。最有趣的事情是 Jython 不像 CPython 或其他任何高级语言,它提供了对其实现语言的一切存取。所以 Jython 不仅给你提供了 Python 的库,同时也提供了所有的 Java 类,这使其有一个巨大的资源库。

(1)使用 maven 添加依赖

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

Jetbrains全家桶1年46,售后保障稳定

(2)使用 PythonInterpreter 执行 Python 语句

PythonInterpreter interp = new PythonInterpreter();
// 执行Python程序语句
interp.exec("import sys");
interp.set("a"new PyInteger(42));
interp.exec("print a");
interp.exec("x = 2+2");
PyObject x = interp.get("x");
System.out.println("x: " + x);

输出结果如下:

42
x: 4

Java 通过 Jython API 执行Python语句,相当于在Java中嵌入了Python程序,这种用法不常见,也没有太大的实际意义。

2、 在 java 中调用 python 脚本

(1)不需要传递参数,也不接收返回值

首先在本地建立一个 python 脚本,命名为 simple_python.py,写了一个简单函数,代码如下:

#coding=utf-8 
print("Do simple thing in Python")
print("输出中文")

Python 的默认编码文件是用的 ASCII 码,因此文件中有中文时在文件开头加入 #coding=utf-8

在Java中简单调用Python程序,不需要传递参数,也不需要获取返回值:

String python = "E:\\Programming\\PyCharm\\Java\\javatest1.py";
PythonInterpreter interp = new PythonInterpreter();
interp.execfile(python);
interp.cleanup();
interp.close();

执行结果:
在这里插入图片描述

(2)需要传递参数,并接收返回值

首先在本地建立一个 python 脚本,命名为 add.py,写了一个简单的两个数做加法的函数,代码如下:

def add(a,b):
    return a + b

python的功能函数已经写好,接下来我们写一个java的测试类(同样需要用到Jpython包),来测试一下是否可以运行成功。代码如下:

import org.python.core.PyFunction;
import org.python.core.PyInteger;
import org.python.core.PyObject;
import org.python.util.PythonInterpreter;
 
public class Java_Python_test { 
   
 
    public static void main(String[] args) { 
   
        // TODO Auto-generated method stub
        PythonInterpreter interpreter = new PythonInterpreter();
        interpreter.execfile("D:\\add.py");
 
        // 第一个参数为需要执行的函数(变量)的名字,第二个参数为期望返回的对象类型
        PyFunction pyFunction = interpreter.get("add", PyFunction.class);
        int a = 5, b = 10;
        //调用函数,如果函数需要参数,在Java中必须先将参数转化为对应的“Python类型”
        PyObject pyobj = pyFunction.__call__(new PyInteger(a), new PyInteger(b)); 
        System.out.println("the anwser is: " + pyobj);
    }
}

3. 使用 Runtime.getRuntime() 执行脚本文件(推荐)

(1)不需要传递参数,也不接收返回值

先写一个简单的 python 脚本 demo1,代码如下:

import numpy as np
 
a = np.arange(12).reshape(3,4)
print(a)

python 程序中用到了numpy第三方库,并初始化了一个3×4的一个矩阵。
在 Java 中使用 Runtime.getRuntime() 方法来调用 python 程序并输出该结果,java 代码如下:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
public class Demo1 { 
   
    public static void main(String[] args) { 
   
        // TODO Auto-generated method stub
        Process proc;
        try { 
   
            proc = Runtime.getRuntime().exec("python D:\\demo1.py");// 执行py文件
            //用输入输出流来截取结果
            BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
            String line = null;
            while ((line = in.readLine()) != null) { 
   
                System.out.println(line);
            }
            in.close();
            proc.waitFor();
        } catch (IOException e) { 
   
            e.printStackTrace();
        } catch (InterruptedException e) { 
   
            e.printStackTrace();
        } 
    }
}

输出的结果:
在这里插入图片描述

(2)需要传递参数,并接收返回值

先写一个 python 的程序 func.py,代码如下:

import sys
 
def func(a,b):
    return (a+b)
 
if __name__ == '__main__':
    a = []
    for i in range(1, len(sys.argv)):
        a.append((int(sys.argv[i])))
 
    print(func(a[0],a[1]))

其中 sys.argv 用于获取参数 url1,url2 等。而 sys.argv[0] 代表 python 程序名,所以列表从 1 开始读取参数

在 java 中传递函数参数,代码如下:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
 
public class Demo1 { 
   
    public static void main(String[] args) { 
   
        // TODO Auto-generated method stub
        int a = 18;
        int b = 23;
        try { 
   
            String[] args1 = new String[] { 
    "python", "D:\\demo2.py", String.valueOf(a), String.valueOf(b) };
            Process proc = Runtime.getRuntime().exec(args1);// 执行py文件

            BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
            String line = null;
            while ((line = in.readLine()) != null) { 
   
                System.out.println(line);
            }
            in.close();
            proc.waitFor();
        } catch (IOException e) { 
   
            e.printStackTrace();
        } catch (InterruptedException e) { 
   
            e.printStackTrace();
        }
    }
}

其中 args1 是 String[] { “python”, path, url1, url2 },path 是 python 程序所在的路径,url1 是参数1,url2 是参数2,以此类推。

执行结果:
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/198345.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 放在u盘根目录就可运行的efi shell_U盘PE启动安装Win7系统教程(微PE版)

    放在u盘根目录就可运行的efi shell_U盘PE启动安装Win7系统教程(微PE版)本教程讲述如何通过微PE制作U盘PE启动盘来安装纯净无捆绑的Win7GHO镜像,U盘装系统的优点在于灵活性更强兼容性更好,支持BIOS+MBR和EFI+GPT下安装,即使原系统启动不了也能装。下面以安装专注于win7最新月版作品为示例,也适用于其它GHO镜像重装。操作步骤1、首先制作一个U盘PE启动盘,本教程以纯净好用的微PE为示例,PE及工具不唯一,大家可根据自己需要选择纯净无捆绑的…

    2022年7月24日
    8
  • 可变长子网掩码划分例题_最小生成树是什么

    可变长子网掩码划分例题_最小生成树是什么北极的某区域共有 n 座村庄,每座村庄的坐标用一对整数 (x,y) 表示。为了加强联系,决定在村庄之间建立通讯网络,使每两座村庄之间都可以直接或间接通讯。通讯工具可以是无线电收发机,也可以是卫星设备。无线电收发机有多种不同型号,不同型号的无线电收发机有一个不同的参数 d,两座村庄之间的距离如果不超过 d,就可以用该型号的无线电收发机直接通讯,d 值越大的型号价格越贵。现在要先选择某一种型号的无线电收发机,然后统一给所有村庄配备,数量不限,但型号都是 相同的。配备卫星设备的两座村庄无论相距多远都可以直

    2022年8月9日
    1
  • pycharm如何缩进多行代码_pycharm整段代码缩进

    pycharm如何缩进多行代码_pycharm整段代码缩进pycharm多行代码缩进、左移在使用pycharm时,经常会需要多行代码同时缩进、左移,pycharm提供了快捷方式1、pycharm使多行代码同时缩进鼠标选中多行代码后,按下Tab键,一次缩进四个字符2、pycharm使多行代码同时左移鼠标选中多行代码后,同时按住shift+Tab键,一次左移四个字符…

    2022年8月25日
    0
  • 吐血总结:解决 Reboot and select proper boot device or ……以及其它蓝屏黑屏「建议收藏」

    吐血总结:解决 Reboot and select proper boot device or ……以及其它蓝屏黑屏「建议收藏」程序猿一枚,笔记本用了两年了,被我鼓捣的死去活来,难免会跟我闹些“小别扭”,借助各种黑屏蓝屏对我“发脾气”~开始还好(一年前),一些小错误还都镇的住,免去了重装系统带来的麻烦。近来不知怎地,各种傲娇,疯狂蓝屏、自动重启外加重启后黑屏,最让我头疼的就是Rebootandselectproperbootdeviceor。。。这个错误,以前都还好,出现这个错误之后进入BIOS面板来回调…

    2022年4月30日
    238
  • visual studio发生了未处理的异常_灾难性故障0x8000ffff

    visual studio发生了未处理的异常_灾难性故障0x8000ffff故障说明:使用vs2010时,由于文件创建MFC类时,移除文件后重新创建正确的基类,覆盖之前创建的文件造成,在“解决方案资源管理器”点击“cpp”文件弹出该提示。解决方法:在“解决方案资源管理器”,重命名cpp文件,双击打开后,改回原名即可。

    2022年9月24日
    0
  • cmd查看哪个端口被占用并终止其占用进程

    cmd查看哪个端口被占用并终止其占用进程打开cmd,输入命令:netstat-ano,列出所有端口的情况;查看被占用端口对应的PID,输入命令:netstat-aon|findstr“端口号”,回车,最后一位数字即PID;利用命令taskkill/f/pid进程ID结束进程。…

    2022年5月12日
    35

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号