Java调用Python程序方法总结(最全最详细)-程序员宅基地

技术标签: 爬虫  python  java  

如何使用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函数库会比老版本的多些,目前最新版本为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语句了,具体代码如下:

import org.python.util.PythonInterpreter;

public class Main {
    
    public static void main(String[] args) {
    
        PythonInterpreter interpreter = new PythonInterpreter();
        interpreter.exec("a=[5,4,3,2,1]");
        interpreter.exec("print(sorted(a))");
    }
}

在这里插入图片描述

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) {
    
        Process proc;
        try {
    
            proc = Runtime.getRuntime().exec("python D:\\IDEA\\spring4all\\JPython\\src\\main\\java\\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中怎么传递函数参数,代码如下:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Demo2 {
    
    public static void main(String[] args) {
    
        int a = 18, b = 23;
        try {
    
            String[] args1 = new String[]{
    "python", "D:\\IDEA\\spring4all\\JPython\\src\\main\\java\\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 | InterruptedException e) {
    
            e.printStackTrace();
        }
    }
}

其中args是String[] { “python”,path,url1,url2 }; ,path是python程序所在的路径,url1是参数1,url2是参数2,以此类推。
最后结果如图所示:
在这里插入图片描述
最后补充一点:
本人电脑上由于同时存在两个python,而我不想用默认的那个,也不想修改默认的python解释器,这种情况下,可以写一个bat文件,在bat文件中通过dos命令切换到该python所在目录,然后运行py文件

py文件:

import time

print('hello!')
time.sleep(120)
print('bye!')

bat文件:

@echo off
D:
cd D:\ProgramData\Anaconda3
start python D:\IDEA\spring4all\JPython\src\main\java\test.py
exit

Java程序:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Demo3 {
    
    public static void main(String[] args) {
    
        Process proc;
        try {
    
            proc = Runtime.getRuntime().exec("cmd /c D:\\IDEA\\spring4all\\JPython\\src\\main\\java\\run.bat");
            //用输入输出流来截取结果
            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 | InterruptedException e) {
    
            e.printStackTrace();
        }
    }
}

参考资料

  1. http://blog.csdn.net/it_xiao_bai/article/details/79074988
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40507857/article/details/120041897

智能推荐

Webmin 远程代码执行 (CVE-2022-0824)漏洞搭建复现+攻击检测原理(流量分析)详细-程序员宅基地

文章浏览阅读2.9k次。在 Webmin v1.984 中,影响文件管理器模块,任何没有文件管理器模块访问权限的经过身份验证的低权限用户都可以与文件管理器功能交互,例如从远程 URL 下载文件和更改文件权限 (chmod)。通过在文件管理器中链接这些功能,可以通过精心制作的 .cgi 文件实现远程代码执行。_cve-2022-0824

远程项目和本地项目合并的解决方案-idea或本地git测试都行_同类项目合并方案-程序员宅基地

文章浏览阅读1.5k次。原文地址https://blog.csdn.net/kiddd_fu/article/details/78247290终极解决方案出现(non-fast-forward)的根本原因是repository已经存在项目且不是你本人提交(我知道是大概率你提交的,但是git只认地址),你commit的项目和远程repo不一样。这时该怎么办呢?很简单,把远端项目拉回本地:git pull然而pu..._同类项目合并方案

MySQL的索引结构为什么是B+树?_navicat为什么只能创建的索引结构是b树-程序员宅基地

文章浏览阅读5.3k次,点赞9次,收藏59次。博客主页:看看是李XX还是李歘歘每天分享一些包括但不限于计算机基础、算法等相关的知识点点关注不迷路,总有一些知识点是你想要的️今天的内容是 MySQL的索引结构为什么是B+树? ️先来看一下树的演化:树:非线性结构,每个节点有唯一的一个父结点和多个子结点(子树),为一对多的关系。 二叉树:每个结点最多有两颗子树,并且子树有左右之分,不能颠倒。 满二叉树:每一层的结点个数都达到了当层能达到的最大结点数。 完全二叉树:除了最..._navicat为什么只能创建的索引结构是b树

主流的开发语言和开发环境介绍-程序员宅基地

文章浏览阅读1.2k次,点赞13次,收藏9次。主流的开发语言和开发环境介绍 _开发语言

WPF自定义控件——顶级控件-程序员宅基地

文章浏览阅读595次。作为一个WPF程序员,我最希望看到的是WPF的应用,或者更确切的说是绚丽的应用,虽然限于自身的实力还不能拿出成绩来,但看到别人的作品时,心里还是有很大的宽慰——WPF是可以做出更加动人地产品的,只要你坚定的走下去,带着不满现状的追求走下去。 下图是Telerik的WPF控件,我相信很多人也下过他的DEMO,研究过他的代码,并由此激起对WPF的信心。今天我们就来仿造他的Drag..._wpf 自定义控件示例

让pandas狠狠的玩转excel_pandas对于excel来说什么时候好用-程序员宅基地

文章浏览阅读380次。先来无事,开始总结自己最近学过做过的东西。想想,数据才是所有网络和编程的核心,包括人工智能。但是自己的数据处理能力,仅仅停留在excel基础,只用代码完成过64个表格的批量筛选和提取。后来阅读和搜索发现,Python里面处理数据,pandas和numpy才是王道。所以最近开始想办法学习这两个东西。怎么学?看代码,看书,太枯燥。买课又不想花钱。经过研究发现,pandas是可以处理类似excel结..._pandas对于excel来说什么时候好用

随便推点

临床试验中edc录入_一文了解EDC临床试验数据采集系统-程序员宅基地

文章浏览阅读7.1k次。不知道大家是不是和我一样,初入行业的时候并不懂啥是EDC。后来我觉得,当时不懂也正常,毕竟EDC这种东西在国内出现也没多久。说起EDC要先从CRF(Case Report Form),即临床试验病例报告表说起。啥是CRF呢?在药物的临床试验项目中,不管你protocol写得多牛比,总得需要一项一项地去收集受试者的试验信息,比如受试者今天吃了多少药?有没有不良反应? 血液中各项指标是多少?因此我们需..._edc录入

Windows环境中同时安装Oracle9i 和10g_大胖黑马(授权发布)-程序员宅基地

文章浏览阅读172次。Windows环境中同时安装Oracle9i 和10g                               原创者:大胖黑马(授权发布)简单说一下在windows的同一用户下,安装Oracle的9i、10g 的方法1、安装版本需要从低到高。也就是说先安装9i的数据库,然后安装10g的数据库2、安装目录分开。3、在低版本的数据库安装完成后,最好通过..._oracle 9i 和oracle 10g同时使用

OpenCV-Python官方教程-30- 支持向量机(support vector machines, SVM)_python opencv 计算向量-程序员宅基地

文章浏览阅读305次。使用SVM进行手写数据OCR在 kNN 中我们直接使用像素的灰度值作为特征向量。这次我们要使用方向梯度直方图Histogram of Oriented Gradients (HOG)作为特征向量。在计算 HOG 前我们使用图片的二阶矩对其进行抗扭斜(deskew)处理,也就是把歪了的图片摆正。所以我们首先要定义一个函数 deskew(),它可以对一个图像进行抗扭斜处理。下面就是 deskew() 函数:..._python opencv 计算向量

CUDA入门3.1——使用CUDA实现鱼眼转全景图(OpenCV环节)_鱼眼图像展开成全景图-程序员宅基地

文章浏览阅读2.7k次。思路1,通过某种方法获取图片数据,并且了解数据结构。 2,通过某种数学公式将鱼眼画面处理成全景图。 3,通过CUDA并行运算实现鱼眼转全景图功能。 本篇主要讲述OpenCV获取图片以及指针的使用,与CUDA无关。获取图片数据OpenCV环境配置1 下载OpenCVOpenCV 下载驿站(百度云盘下载,同步更新)2 配置OpenCV开发环境配置的方法网上很多,可以查找。我用的是 OpenCV环境_鱼眼图像展开成全景图

JAVA-SFTP秘钥连接下载和上传文件_如何用sftp密钥下载文件到本地密钥-程序员宅基地

文章浏览阅读2.1k次,点赞3次,收藏13次。最近做SFTP连接获取文件,遇到好多坑,记录一下防止以后重复踩坑无效秘钥文件1.版本低导致文件无效2.windows系统不支持ppk秘钥文件,必须转换成pem秘钥文件com.jcraft.jsch.JSchException: invalid privatekey: C:/upload/tpl/privateKey.ppk at com.jcraft.jsch.IdentityFile.<init>(IdentityFile.java:302) at com.jc..._如何用sftp密钥下载文件到本地密钥

RPM安装nginx_nginx rpm-程序员宅基地

这篇文章介绍了通过在阿里云镜像网站下载epel源来安装nginx的过程,包括下载epel源、安装nginx rpm包、访问nginx默认网页以及nginx的安装配置文件路径和默认文件位置。

推荐文章

热门文章

相关标签