Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >java调用python脚本返回的参数_javaweb调用python

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

作者头像
全栈程序员站长
发布于 2022-11-01 03:18:49
发布于 2022-11-01 03:18:49
5.1K10
代码可运行
举报
运行总次数:0
代码可运行

实际工程项目中可能会用到 Javapython 两种语言结合进行,这样就会涉及到一个问题,就是怎么用 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 添加依赖

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>org.python</groupId>
    <artifactId>jython-standalone</artifactId>
    <version>2.7.0</version>
</dependency>

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

(2)使用 PythonInterpreter 执行 Python 语句

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);

输出结果如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
42
x: 4

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

2、 在 java 中调用 python 脚本

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#coding=utf-8 
print("Do simple thing in Python")
print("输出中文")

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
String python = "E:\\Programming\\PyCharm\\Java\\javatest1.py";
PythonInterpreter interp = new PythonInterpreter();
interp.execfile(python);
interp.cleanup();
interp.close();

执行结果:

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def add(a,b):
    return a + b

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import numpy as np
a = np.arange(12).reshape(3,4)
print(a)

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 中传递函数参数,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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.cn/198345.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月21日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
作者您好,出现in.readLine()为空,是为什么呀,脚本是有返回值的
作者您好,出现in.readLine()为空,是为什么呀,脚本是有返回值的
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
打工人打工魂,打工的必会java调用python的几种用法(看这篇就够了)
创建maven工程,结构如下:到官网https://www.jython.org/download.html下载Jython的jar包或者在maven的pom.xml文件中加入如下代码:
用户7656790
2020/11/03
6K0
打工人打工魂,打工的必会java调用python的几种用法(看这篇就够了)
Java【代码 07】Java执行Python代码的3类5种情况测试(Java源码+Python源码举例)
python拥有的某些库要比Java强大,也拥有一些比Java更擅长的领域,python可以搭建后端让Java调用接口,但某些时候我们用到的python代码可能并不多也许只有一个算法,此时就需要以下方法了。
yuanzhengme
2025/07/25
1080
Java调用含第三方库Python脚本传递数据并返回计算结果
目前有几种Java调用Python的方法,不过能良好兼容Python第三方库的方法通常是使用
SL_World
2021/09/18
2.8K0
Java安全--反序列化之Jython链(2)
本文属于OneTS安全团队成员v4por的原创文章,转载请声明出处!本文章仅用于学习交流使用,因利用此文信息而造成的任何直接或间接的后果及损失,均由使用者本人负责,OneTS安全团队及文章作者不为此承担任何责任。
OneTS安全团队
2025/02/07
1060
Java安全--反序列化之Jython链(2)
Java调用CMD命令
Windows下复制: copy C:\server\data\ccgavr\1.png C:\server\data\ccgavr\2.png Windows重命名: ren 1.png 3.png ren C:\server\data\ccgavr\1.png C:\server\data\ccgavr\3.png(DOS中提示命令语法不正确,powershell则可以)
JaneYork
2023/10/11
4830
Java调用CMD命令
java调用python方法总结
http://download.csdn.net/detail/xingjiarong/9429266 下载jython包,把其中的jython.jar添加到工程目录
py3study
2020/01/14
1.9K0
Linux:java通过Runtime.getRuntime().exec()执行shell,Process.waitFor()返回Required key not available(126)问题
因为看到错误码对应的原因是:Required key not available,所需的Key不可用。查找了很多相关解决办法,发现都不太相关。
鲲志说
2025/04/07
1300
Linux:java通过Runtime.getRuntime().exec()执行shell,Process.waitFor()返回Required key not available(126)问题
JAVA001-java  调用bash shell脚本阻塞问题的解决
使用java实现的web端,web端相应用户的界面操作,使用java调用bash实现的shell脚本进行实际的操作,操作完成返回执行结果给web 界面显示。
上善若水.夏
2018/09/28
1.5K0
scala调用python
Jpython(http://www.jython.org/)是一个java的扩展包,在scala里面可以直接调用
py3study
2020/01/08
2.2K0
【转】Java中Runtime.exec的一些事 
Runtime类是一个与JVM运行时环境有关的Singleton类,有以下几个值得注意的地方:
yiduwangkai
2019/09/17
3.2K0
java调用wkhtmltopdf生成pdf文件,美观,省事
最近项目需要导出企业风险报告,文件格式为pdf,于是搜了一大批文章都是什么Jasper Report,iText ,flying sauser ,都尝试了一遍,感觉不是我想要的效果,
大道七哥
2019/09/10
5.3K1
java调用wkhtmltopdf生成pdf文件,美观,省事
java Runtime.exec()执行shell/cmd命令:常见的几种陷阱与一种完善实现
我们项目要java执行命令“dmidecode -s system-uuid”获取结果,然而碰到问题,当项目一直执行好久后,Runtime.getRuntime().exec()获取结果为空,但也不报错,重启项目就又可以了,所以猜测属于陷阱2,并进行记录。
刘大猫
2024/11/17
1K0
Java调用Python爬虫
用java调用python的爬虫程序,是一件很有意思的事情, 但解决方法大多不靠谱,作者花了两天的时间,动手实践,最终完全解决了问题 java-python Java调用Python爬
zhaoolee
2018/04/28
3K0
Java调用Python爬虫
SpringBoot代码片段,方便自己查看[持续添加]
或者参考:https://www.cnblogs.com/nuccch/p/8435693.html 官网:https://www.jython.org/download 精简版jar:jython-compile-maven-plugin-test-1.2-jar-with-dependencies.jar
小锋学长生活大爆炸
2020/11/03
4140
pycharm编写的文件如何执行_pycharm可以写java吗
最近在做编译原理课设,准备用Java写个GUI整合一下,因为自己的LL1文法使用python写的,所以需要Java来实现运行python代码,网上给出了主要三种方法,但是使用Jython的方法有局限性且不太方便,于是我将采用最简洁的方法
全栈程序员站长
2022/09/27
1.1K0
Python与Java互操作相互调用的解决方案大全
Python与Java是两种流行的编程语言,各自有不同的优势。Java适用于大型企业级应用,而Python则因其简洁和强大的生态系统而广受欢迎。在某些应用场景下,我们需要让Python和Java相互调用,例如:
猫头虎
2025/03/29
6590
storm(3)-任务提交
本地模式其实其实使用的是127.0.0.1,如果在storm集群上,借助storm jar则使用的是storm.yaml中的配置
yiduwangkai
2019/09/17
5720
storm(3)-任务提交
Java调用EXE
做文档转换的时候,使用Java调用COM接口的时候,如果文档中有字体没有的话,在转换的时候会弹窗,导致转换卡死,再加上转图片还需要装额外的软件,比较麻烦。
码客说
2023/04/27
1.7K0
【更正】Java调用Python
该方法可以解决传递形参的问题。也可以执行Python程序。 遇到的问题:需要确定好jython的路径问题和其他设置的路径问题。
一点儿也不潇洒
2018/08/07
8370
探索Java中如何执行python脚本
 一个偶然的场景,笔者需要在java代码中执行某个python脚本,并且需要向脚本中传递参数,有可能的话,还要获取该脚本的某些执行结果,回到主程序中继续执行下去。
雷子
2021/03/15
1.7K0
探索Java中如何执行python脚本
相关推荐
打工人打工魂,打工的必会java调用python的几种用法(看这篇就够了)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验