知行编程网知行编程网  2022-10-11 22:30 知行编程网 隐藏边栏  44 
文章评分 0 次,平均分 0.0
导语: 本文主要介绍了关于java编写的界面可以调用python吗的相关知识,包括java和python哪个好,以及python调用java代码这些编程知识,希望对大家有参考作用。

java写的接口能不能调用python


如何使用Java调用Python程序

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

在实际工程项目中,可能会使用Java和python的结合,这会涉及到一个问题,就是如何使用Java程序调用已经编写好的python脚本。有三种方法可以实现它。具体方法给大家介绍一下:


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

该方法需要参考org.python包,需要下载Jpython。这里先介绍一下Jpython。以下是维基百科的解释:

Jython 是一种完整的语言,不是 Java 翻译器或仅仅是 Python 编译器,它是 Java 中 Python 语言的完整实现。 Jython 还有很多继承自 CPython 的模块库。最有趣的是,Jython 不像 CPython 或任何其他高级语言,它提供了对其实现语言的所有访问。所以 Jython 不仅为你提供 Python 库,还为你提供所有 Java 类。这使它成为一个巨大的存储库。

这里我推荐下载最新版本的Jpython,因为可以使用的python函数库会比旧版本多,最新版本是2.7。

下载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版本的语法

输出结果如下:

java写的接口能不能调用python

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

但是每次运行结果都会提示控制台:Failed to install '': java.nio.charset.UnsupportedCharsetException: cp0.这看起来很烦人,因为每次运行的结果都会出现一个红色的提示语句,以为是错误,程序员应该不想看到这个场景,我得想办法解决。

解决方法如下:

右键单击要执行的代码,Run As>Run Configurations,选择第二个选项卡Arguments,在VM arguments中添加如下语句

-Dpython.console.encoding=UTF-8

然后Apply->Run就可以了。

如下图所示:

java写的接口能不能调用python


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);
}
}

运行结果如图所示:

java写的接口能不能调用python

注意:上述两种方法虽然可以调用python程序,但是Jpython调用的python库并不多。如果在python程序中使用上述两种方法调用和使用第三方库,会报错java ImportError。 : 没有名为 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();
} 
}
}

输出的结果如下图所示:

java写的接口能不能调用python

可以看出运行成功了,但是有的朋友可能会问,如何在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,以此类推。

最后结果如图所示:

java写的接口能不能调用python

OK,成功了。

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写
扫一扫二维码分享