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

如何使用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.mzph.cn/web/33922.shtml

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

相关文章

【源码+文档+调试讲解】牙科就诊管理系统

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本牙科就诊管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

学法减分题库最新版,分享几个简单试用的学习和搜题工具 #微信#经验分享#知识分享

告别繁琐的查询步骤&#xff0c;用我们的拍照搜题功能&#xff0c;只需几秒钟&#xff0c;答案就出现在你眼前&#xff0c;让学习变得更加高效便捷。 1.减分侠 这是个辅助学分减分的公众号 根据新的学法减分考试大纲&#xff0c;涵盖小车、客车、货车、摩托车&#xff0c;各…

【AI落地应用实战】如何高效检索与阅读论文——302.AI学术论文工具评测

一、引言 作为一名学术领域的探索者&#xff0c;我们都知道&#xff0c;检索和阅读论文是我们获取知识、启发思考、验证假设的基石&#xff0c;也是日常学习中必不可少的基本功之一。然而在浩瀚的学术海洋中&#xff0c;如何快速、准确地找到我们需要的论文&#xff0c;就像是…

史上最全涵盖在线离线nginx安装手册(含国产信创环境下麒麟V10)

下载安装包略 下载地址&#xff1a;http://nginx.org/download/nginx-版本.tar.gz 配合下载资源食用更佳 https://download.csdn.net/download/ProGram_BlackCat/89480431 安装 tar -zxvf nginx-1.16.1.tar.gz && cd nginx-1.16.1# 创建安装目录(默认路径↓) mkdir /u…

摩柏BI,轻松实现word报告自动更新

|| 导语 告别手工&#xff01;在数字化办公的今天&#xff0c;高效、准确的数据处理能力已经成为职场人士必备的技能之一。尤其是对于财务分析师、市场研究员和管理人员&#xff0c;他们需要处理的报告不仅数量庞大&#xff0c;而且对数据的准确性和实时性要求极高。传统WORD报…

指针(一)

指针基础 在C中&#xff0c;指针是至关重要的组成部分。它是C语言最强大的功能之一&#xff0c;也是最棘手的功能之一。 指针具有强大的能力&#xff0c;其本质是协助程序员完成内存的直接操纵。 指针&#xff1a;特定类型数据在内存中的存储地址&#xff0c;即内存地址。 …

计算机网络课程实训:局域网方案设计与实现(基于ensp)

文章目录 前言基本要求操作分公司1分公司2总部核心交换机配置实现内部服务器的搭建acl_deny部分用户与服务器出口出口防火墙配置 前言 本篇文章是小编实训部分内容&#xff0c;内容可能会有错误&#xff0c;另外ensp对电脑兼容性及其挑剔&#xff0c;在使用之前一定要安装好。…

大模型日报|8 篇必读的大模型论文

大家好&#xff0c;今日必读的大模型论文来啦&#xff01; 1.M2Lingual&#xff1a;在大语言模型中加强多语言、多轮次的指令对齐 指令微调对于大语言模型&#xff08;LLM&#xff09;按照指令进行对齐至关重要。最近提出了许多有效的 IFT 数据集&#xff0c;但大多数数据集都…

七天速通javaSE:第一天 入门:Hello,Word与程序运行机制

文章目录 前言一、Hello&#xff0c;Word&#xff01;1.新建一个文件夹存放代码2.新建一个.java文件3.编写代码 二、编译与运行1.在控制台编译java文件2.运行class文件 三、java程序运行机制1.高级语言的分类1.1 编译型语言1.2 解释型语言 2.程序运行机制 四、IDEA五、代码规范…

lambdastreammaven

1.Lambda &#xff08;1&#xff09;Java 8 Lambda 表达式 在 Java 8 以前&#xff0c;若我们想要把某些功能传递给某个方法&#xff0c;总要去写内部类 或匿名内部类类。代码示例&#xff1a; list.sort(new Comparator<User>() { Override public int compare(User …

AWS IAM 通过策略设置,实现对账户及其访问密钥(AK/SK)的IP白名单限制

AWS IAM 通过策略设置&#xff0c;实现对账户及其访问密钥&#xff08;AK/SK&#xff09;的IP白名单限制&#xff0c;也算是best practices了。 {"Version": "2012-10-17","Statement": {"Effect": "Deny","Action&qu…

Linux显示服务器Wayland切换到X11

1、临时切换 &#xff1a; 注销当前用户账户&#xff0c;返回到登录屏幕。 在登录屏幕上&#xff0c;选择您要登录的用户账户。 在输入密码之前&#xff0c;在登录屏幕的右下角可能有一个齿轮图标&#xff0c;点击它以展开更多选项。 在选项中选择“Ubuntu on Xorg”或“Ubu…

Windows的FLAT内存模式

在基于x86的Windows系统中&#xff0c;在x86保护模式下&#xff0c;地址总线是32位的&#xff0c;所有通用寄存器都是32位的&#xff0c;间接寻址时不用分段就可以寻址4GB的地址空间。保护模式下&#xff0c;所有段的基地址都是0&#xff0c;段限长是0xFFFFFFFF。段寄存器存放段…

SQL 高频面试题

SQL 初级面试题及其详细解答&#xff1a; 1. 什么是 SQL&#xff1f;简要解释其用途。 解答&#xff1a; SQL&#xff08;结构化查询语言&#xff09;是一种用于管理和操作关系数据库的标准语言。它用于执行查询、更新、插入、删除和其他数据库操作&#xff0c;帮助用户从数据…

selenium之批量删除按钮操作

具体需求&#xff1a; 需要将某个列表项目中只保留一条数据&#xff0c;但是不确定有没有&#xff0c;所以需要先判断列表中有没有数据&#xff0c; 如果有数据查看是否大于1条&#xff0c;大于1条则删除到只有1条&#xff0c;只有一条则直接进行修改操作&#xff1b; 如果没有…

FTP 550 No such file or directory-

FTP is a simple method to upload files to the server. Although, it is rather easy to transfer files, FTP users often get stuck with errors. One such FTP error is “550 No such file or directory“. Broadly speaking, this error means that the file or folde…

2732. 找到矩阵中的好子集

题目 给你一个下标从 0 开始大小为 m x n 的二进制矩阵 grid。 从原矩阵中选出若干行构成一个行的非空子集&#xff0c;如果子集中任何一列的和至多为子集大小的一半&#xff0c;那么我们称这个子集是好子集。 更正式的&#xff0c;如果选出来的行子集大小&#xff08;即行的…

CNN-O-ELMNet: 优化的轻量化通用模型,用于肺部疾病分类和严重性评估| 文献速递-先进深度学习疾病诊断

Title 题目 CNN-O-ELMNet: Optimized Lightweight andGeneralized Model for Lung DiseaseClassification and Severity Assessment CNN-O-ELMNet: 优化的轻量化通用模型&#xff0c;用于肺部疾病分类和严重性评估 01 文献速递介绍 肺部疾病是全球主要的致残和死亡原因。根…

nextjs-创建layouts共用UI和独立pages页面

原文链接&#xff1a;https://nextjs.org/learn/dashboard-app/creating-layouts-and-pages 01-nextjs起步02-css样式03-处理字体和图片05-页面之间的导航跳转更多 到目前为止&#xff0c;您的应用程序只有一个主页。让我们学习如何使用布局和页面创建更多路由。 本章目标 …

【学习】科大睿智解读ITSS认证中咨询机构的作用

企业拥有ITSS认证这不仅将为企业开拓商机&#xff0c;提升竞争力&#xff0c;还能促使企业改进内部运维流程&#xff0c;提高服务质量&#xff0c;为客户提供更优质的IT运维支持。在ITSS认证中&#xff0c;咨询机构扮演着重要的角色&#xff0c;其主要作用包括以下几个方面&…