java编写的界面可以调用python吗

news2024/11/15 17:34:25

如何使用Java调用Python程序

本文为大家介绍如何java调用python方法,供大家参考。

实际工程项目中可能会用到Java和python两种语言结合进行,这样就会涉及到一个问题,就是怎么用Java程序来调用已经写好的python脚本呢,一共有三种方法可以实现,具体方法分别为大家介绍:

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

此方法需要引用org.python包,需要下载Jpython。在这里先介绍一下Jpython。下面引入百科的解释:

Jython是一种完整的语言,而不是一个Java翻译器或仅仅是一个Python编译器,它是一个Python语言在Java中的完全实现。Jython也有很多从CPython中继承的模块库。最有趣的事情是Jython不像CPython或其他任何高级语言,它提供了对其实现语言的一切存取。所以Jython不仅给你提供了Python的库,同时也提供了所有的Java类。这使其有一个巨大的资源库。

这里我建议下载最新版本的Jpython,因为可以使用的python函数库会比老版本的多些。

下载jar包请点击Download Jython 2.7.0 - Standalone Jar

下载安装程序请点击Download Jython 2.7.0 - Installer

如果使用maven依赖添加的话,使用下面的语句:

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

以上准备好了,就可以直接在java类中写python语句了,具体代码如下:

PythonInterpreter interpreter = new PythonInterpreter();
interpreter.exec("a=[5,2,3,9,4,0]; ");
interpreter.exec("print(sorted(a));");  //此处python语句是3.x版本的语法
interpreter.exec("print sorted(a);");   //此处是python语句是2.x版本的语法

输出结果如下:

这里会看到输出的结果都是一样的,也就是说Jpython兼容python2.x和3.x版本的语句,运行速度会比直接运行python程序稍慢一点。

但是每次运行结果都会提示console: Failed to install ‘’: java.nio.charset.UnsupportedCharsetException: cp0. 这样看起来很烦,因为每次运行结果都会出现红色的提示语句,以为是错误,程序员应该都不愿意看到这一幕,得想个办法解决。

解决方法如下:

在要执行的代码上右键, Run As>Run Configurations,选择第二个页签Arguments,在VM arguments中添加以下语句

-Dpython.console.encoding=UTF-8

然后Apply->Run就可以了。

如下图所示:

2. 在java中调用本地python脚本

首先在本地建立一个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);
}
}

运行结果如图所示:

注意:以上两个方法虽然都可以调用python程序,但是使用Jpython调用的python库不是很多,如果你用以上两个方法调用,而python的程序中使用到第三方库,这时就会报错java ImportError: No module named xxx。遇到这种情况推荐使用下面的方法,即可解决该问题。

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

为了验证该方法可以运行含有python第三方库的程序,我们先写一个简单的python脚本,代码如下:

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

可以看到程序中用到了numpy第三方库,并初始化了一个3×4的一个矩阵。

下面来看看怎么用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();
} 
}
}

输出的结果如下图所示:

可以看到运行成功了,但有的朋友可能会问了,怎么在python程序中函数传递参数并执行出结果,下面我就举一例来说明一下。

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

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中怎么传递函数参数,代码如下:

int a = 18;
int b = 23;
try {
String[] args = new String[] { "python", "D:\\demo2.py", String.valueOf(a), String.valueOf(b) };
Process proc = Runtime.getRuntime().exec(args);// 执行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();
}

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

最后结果如图所示:

OK,成功了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1861146.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Verilog HDL语法入门系列(四):Verilog的语言操作符规则(下)

目录 7.移位操作符8.关系操作符9.相等操作符9.1逻辑等与case等9.2逻辑等与逻辑不等9.3 case等与case不等 10.条件操作符11.级联操作符12.复制 微信公众号获取更多FPGA相关源码&#xff1a; 7.移位操作符 符号含义>>逻辑右移<<逻辑左移 移位操作符对其左边的操作…

JVM虚拟机的组成

一、为什么要学习 JVM &#xff1f; 1. “ ⾯试造⽕箭&#xff0c;⼯作拧螺丝” &#xff0c; JVM 属于⾯试官特别喜欢提问的知识点&#xff1b; 2. 未来在⼯作场景中&#xff0c;也许你会遇到以下场景&#xff1a; 线上系统突然宕机&#xff0c;系统⽆法访问&#xff0c;甚⾄直…

IDS Gaia-X Catena-X Manufacturing-X的关系

来源&#xff1a;小盟科普丨Catena-X数据空间在汽车领域落地https://mp.weixin.qq.com/s/Ftp0UGAohsh4ltLn3DylAw

苹果电脑清理垃圾怎么清理 macbook怎么清理电脑垃圾文件 macos优化软件 cleanmymac怎么使用

在选择电脑时&#xff0c;不少人都会选择拥有高性能和轻薄机身的mac。一开始&#xff0c;它确实如我们所期待的那样健步如飞&#xff0c;然而&#xff0c;随着时间的流逝&#xff0c;有没有觉得您的Mac有时候像是需要一个好的春季大扫除一样&#xff1f;随着我们不断使用电脑&a…

IMU应用于颈部健康监测

随着电脑成为日常工作的必备工具&#xff0c;长时间使用电脑导致的颈部疼痛问题日益受到关注。近日&#xff0c;一项创新研究利用IMU开发了一种新型监测系统&#xff0c;用来监测电脑使用者的颈部姿势和疼痛情况。 在为期两天的实验中&#xff0c;8名办公室工作者分别在静态和…

2024年世界移动大会(MWC Shanghai)——飞睿智能诚邀您,超宽带技术定位测距传输全家桶

超宽带UWB芯片SIP系列&#xff1a; FS100 FS200 超宽带UWB标签系列&#xff1a; FU3620-2 FUP410-1 超宽带UWB应用系列&#xff1a; FMFB200A&#xff08;门锁方案&#xff09; FU2625-2&#xff08;TAG方案&#xff09; FPDB200A&#xff08;音频&#xff09; FSTB200…

中学政史地杂志中学政史地杂志社中学政史地编辑部2024年第4期目录

每月时政 时政要闻&#xff08;2024年3月&#xff09; 李伟; 3-4 热点聚焦 全面加强基础设施建设,积极扩大有效投资 刘华; 5-7《中学生政史地》投稿&#xff1a;cn7kantougao163.com 蒙古国努力应对冰雪灾害 张仁杰; 8-10 复习指导 高中政治经济全球化内容复习…

【SQL Server数据库】数据的增删改操作

目录 一、用SQL语句完成下列功能。 1、新开设一门课程&#xff0c;名叫网络安全与防火墙&#xff0c;学时40&#xff0c;编号为“0118”&#xff0c;主要介绍网络的安全与主要的防火墙软件。 2、先建立monitor表&#xff0c;其结构与student表大致一样&#xff0e;…

亚马逊运营专词(一)

许多新入驻亚马逊的大陆卖家&#xff0c;对亚马逊的专业词汇还不太了解&#xff0c;导致在运营店铺的过程出现一些问题&#xff0c;今天就来讲解一下亚马逊常用的运营专词&#xff0c;方便新手卖家深入了解。 1. Listing&#xff1a;亚马逊listing指的是产品的详情页面&#xf…

关于jd-gui启动报This program requires Java 1.8+的错误

问题&#xff1a; 在Mac使用上JD-GUI启动时&#xff0c;报了如下的错误&#xff1a; ERROR launching JD-GUINo suitable Java version found on your system! This program requires Java 1.8 Make sure you install the required Java version. 解决方法&#xff1a; 方法…

使用官方新工具手动升级 Quest 操作系统

Meta 近期推出了一款用于手动升级 Meta Quest 系统的工具&#xff0c;为用户提供了更多选择。本文将详细介绍如何使用这一工具进行系统升级。 优势与劣势 优势&#xff1a; 安装迅速&#xff1a;升级速度相比在线自动升级快&#xff0c;且可实时查看进度 即时升级&#xff1…

公关世界杂志社《公关世界》杂志社2024年第12期目录

公关动态 中国公共关系协会在法国巴黎举行黄河文化展 1-2 专题 以书法谈执法 高林; 3-4 乡村振兴与绿色发展 促进黑龙江省冰雪旅游产业高质量发展的支持政策研究 蔡德发;李可新; 5-7《公关世界》投稿&#xff1a;cnqikantg126.com 乡村振兴视域下青年社会责任感…

【快速入门】Transformer: Attention Is All You Need

Transformer → \to → 【知名应用】BERT (unsupervised trained Transformer) Transformer &#xff1a;seq2Seq model with self-attention, 后续会主要说明 self-attentionTransformer的组成&#xff1a; Self-attention是 Attention变体&#xff0c;擅长捕获数据/特征的内…

diffusion扩散模型参考论文与代码

十分钟读懂Diffusion&#xff1a;图解Diffusion扩散模型 - 知乎在之前的文章中&#xff0c;我们曾经介绍过Diffusion的具体原理&#xff0c;但是讲的还是比较偏理论&#xff0c;为了让大家快速了解Diffusion原理&#xff0c;这篇文章我们通过图解的方式。 绝密伏击&#xff1a;…

重点!业内分享:如何找到自己门店的生鲜经营定位

说到经营生鲜品类 许多商超人士或许都会面临这样一个困境 即品类繁多且复杂&#xff0c;那么如何做到精准施策&#xff1f; 比如说&#xff0c;蔬菜和水果虽都归为生鲜&#xff0c;然而细分起来&#xff0c;价格和消费群体均存在差异。像蔬菜&#xff0c;价格通常较低&#…

Redis集群-计算key的插槽值等命令

文章目录 1、集群方式登录主机63792、计算key应该保存在那个插槽3、计算某个插槽中保存的key的数量4、返回指定槽中的键5、查看redis的版本5.1、Redis集群的自动故障转移5.2、主节点下线&#xff0c;从节点自动升为主节点5.2.1、杀死主节点63795.2.2、登录从机6383&#xff0c;…

如何设计出比小米SU7 还酷炫的中控大屏?

最近&#xff0c;国内新能源汽车的热度是一波又一波&#xff0c;比亚迪大降价、小米SU7横空出世…… 智能驾舱&#xff0c;车载设计也受到越来越多人的关注。作为一名软件产品经理或设计师&#xff0c;你可能正在相关行业工作&#xff0c;或准备进入汽车领域。那你一定想了解车…

Android反编译之dex2jar和JD-GUI

文章目录 简述工具dex2jar目标dex文件操作 JD-GUI 简述 1.dex2jar是将dex文件转换为class文件的jar包&#xff1b; 2.JD-GUI是查看转化后的class对应的jar包&#xff1b; 工具 dex2jar 下载地址&#xff1a;https://github.com/pxb1988/dex2jar 点击红框中的Latest版本信息…

T-Reqs:一款基于语法的HTTP漏洞挖掘工具

关于T-Reqs T-Reqs全称为Two Requests&#xff0c;T-Reqs是一款基于语法的HTTP模糊测试漏洞挖掘工具&#xff0c;该工具可以通过发送版本为1.1或更早版本的变异HTTP请求来对目标HTTP服务器进行模糊测试以及漏洞挖掘。该工具主要通过下列三大步骤实现其功能&#xff1a;&#x…

kubernetes pod 最小可部署计算单元

1 工作负载&#xff08;workloads&#xff09; 工作负载&#xff08;workload&#xff09;是在kubernetes集群中运行的应用程序。无论你的工作负载是单一服务还是多个一同工作的服务构成&#xff0c;在kubernetes中都可以使用pod来运行它。 workloads分为pod与controllers p…