建立java与python的接口有几种方式

2021-04-16 13:43发布

7条回答

Jython是一个Python语言在Java中的完全实现(详细解释看另一篇博客Python语法基础的第一部分)。Jython也有很多从CPython中继承的模块库。最有趣的事情是Jython不像CPython或其他任何高级语言,它提供了对其实现语言的一切存取。所以Jython不仅给你提供了Python的库,同时也提供了所有的Java类(反射使Jython能无缝地使用任何Java类。)。这使其有一个巨大的资源库。


虽然上述网络上对Jython的描述看似很美好,但在实际使用的过程中会遇到很多的问题。最大的问题就是Jython在2015年停止更新,目前最新的是 Jython 2.7.0 Final Released(May 2015)。这就会导致Jython无法使用一些新的CPython库。当你只是想要使用Jython编写一些与Java程序混合的、简单的代码时是比较简单的——但是**当你的程序需要导入很多外部库时,Jython总会出现问题。**而且Jython的运行效率也不快。种种原因,最终没有使用Jython。


在Java中使用Jython调用Python中的方法:

首先加入Jython包,这里就有第一个坑,要注意添加的是jython-2.7-b1.jar而不是jython.jar。


import java.io.IOException;


import org.python.core.Py;

import org.python.core.PyFunction;

import org.python.core.PyObject;

import org.python.core.PySystemState;

import org.python.util.PythonInterpreter;


public class JythonMethod {

    public static void main(String[] args) throws IOException {

        PySystemState sys = Py.getSystemState();

        System.out.println(sys.path.toString());

        //由于Jython和JVM的ClassPath不一样,所以需要手动加入项目所需的库文件路径


        sys.path.add("xxx\\libs");//项目库文件


        sys.path.add("xxx\\Lib");//Python自带库文件


        System.out.println(sys.path.toString());



        // 1. Python面向函数式编程: 在Java中调用Python函数

        String pythonFunc = "./xxx/xxx.py";//Python文件路径



        //在JVM中创建一个“Python解释器”对象

        PythonInterpreter pi1 = new PythonInterpreter();

        // 加载python程序

        pi1.execfile(pythonFunc);

        // 调用Python程序中的函数

        PyFunction pyf = pi1.get("methodName", PyFunction.class);

        //写入方法所需的参数,注意要转换为Python的相应类型


        PyObject Res = pyf.__call__(Py.newString("xxx1"),Py.newString("xxx2"));


        System.out.println(Res);

        pi1.cleanup();

    }

}

————————————————


我想吃肉
3楼 · 2021-04-16 19:44

终端(命令行)调用就是老生常谈的东西了,直接使用Java代码执行一段终端(命令行)命令来调用Python文件,简单粗暴。


但这种方式也存在以下问题:


对多线程的支持不好,在部署到服务器的情况下,每次运行都会开启一个终端,消耗资源。


这种方法无法像调用一个方法一样随意传参,毕竟是命令行执行,参数选择无法像内置方法一样随意选择。


使用命令行运行Python脚本:

在以下代码中,我开启了3个线程执行一个Python脚本,脚本耗时3秒,在任务管理器里可以看到程序会开启三个终端。


import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;


class RunnableDemo implements Runnable {

    String name = null;

    public RunnableDemo(String name) {

        this.name = name;

    }


    public void run() {

        //命令行参数(注意先把Python加入环境变量)


        String[] arguments = new String[] { "python", "C:/xxx/xxx.py", "arg1", "arg2"};


        try {

            Process process = Runtime.getRuntime().exec(arguments);

            BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));

            String line = null;

            while ((line = in.readLine()) != null) {

                System.out.println(line);

            }

            in.close();

            int re = process.waitFor();

            System.out.println(re);

        } catch (Exception e) {

            e.printStackTrace();

        }

    }


}


public class RuntimeMethod {

    public static void main(String[] args) throws IOException, InterruptedException {

          RunnableDemo r1 = new RunnableDemo( "Thread1");

          Thread t1 = new Thread(r1);

          t1.start();


          RunnableDemo r2 = new RunnableDemo( "Thread2");

          Thread t2 = new Thread(r2);

          t2.start();

          RunnableDemo r3 = new RunnableDemo( "Thread3");

          Thread t3 = new Thread(r3);

          t3.start();

    }

}


我的网名不再改
4楼 · 2021-04-17 15:38

一、在java类中直接执行python语句


import org.python.util.PythonInterpreter;

public class FirstJavaScript {

    public static void main(String args[]) {

        PythonInterpreter interpreter = new PythonInterpreter();

        interpreter.exec("days=('mod','Tue','Wed','Thu','Fri','Sat','Sun'); ");

        interpreter.exec("print days[1];");

    }// main

}

调用的结果是Tue,在控制台显示出来,这是直接进行调用的。


二、在java中调用本机python脚本中的函数


import org.python.core.PyFunction;

import org.python.core.PyInteger;

import org.python.core.PyObject;

import org.python.util.PythonInterpreter;

 

public class FirstJavaScript {

    public static void main(String args[]) {

 

        PythonInterpreter interpreter = new PythonInterpreter();

        interpreter.execfile("C:\\Python27\\programs\\my_utils.py");

        PyFunction func = (PyFunction) interpreter.get("adder",

                PyFunction.class);

 

        int a = 2010, b = 2;

        PyObject pyobj = func.__call__(new PyInteger(a), new PyInteger(b));

        System.out.println("anwser = " + pyobj.toString());

    }// main

}

得到的结果是:anwser = 2012


三、使用java直接执行python脚本


import org.python.util.PythonInterpreter;

 

public class FirstJavaScript {

    public static void main(String args[]) {

 

        PythonInterpreter interpreter = new PythonInterpreter();

        interpreter.execfile("C:\\Python27\\programs\\input.py");

    }// main

}

四:如若python文件中有引入第三方库如numpy,sklearn,pandas等,可以通过java调用进程的方式


基本思路:通过java调用cmd,传入Python 命令,然后传入参数,通过获取到Python文件中的print,获取返回值


使用方式,将数据txt文件路径通过参数形式,传给Python且运行读取数据,最后java获取python的print的数据。


public static void main(String args[]){

try{

System.out.println("start");

                String[] pythonData =new String[]{"python 运行的命令","py文件路径","测试传参数据文件路径"};

//读取到python文件

Process pr = Runtime.getRuntime().exec(pythonData);

InputStreamReader ir = new InputStreamReader(pr.getInputStream());

LineNumberReader in = new LineNumberReader(ir);

String line ;

//获取到python中的所有print 数据,

while((line=in.readLine()) != null){

System.out.println("python print data"+line);

}

ir.close();

in.close();

pr.waitFor();

System.out.println("end");

}catch(Exception e){

e.printStackTrace();

}

}


啦啦啦
5楼 · 2021-04-17 19:38
不建议研究jython。比较简单的思路是把python脚本完全当做一个外部程序,用shell方式调用它。
首先设计好python脚本的接口,把参数用命令行方式传入,然后输出打印出来。示例:

$ python func.py arg1 arg2
result
然后在java里就可以用Runtime来执行shell命令,解析输出字符串然后得到结果。


靓猴一枚
6楼 · 2021-04-18 18:14

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

2.在java中直接调用python脚

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

4.调用python脚本中的函数

一个Ai
7楼 · 2021-04-19 08:41

jython不用第三方库,JDK自带了,直接java命令行就可以调用
pthyon跟shell脚本一个道理,你直接用java 的System.getRuntime().exec(),像执行一个操作系统的脚本一样调用即可

体育组自行车
8楼 · 2021-08-27 14:48

Java

方式1:创建接口的非匿名实现类的非匿名对象

方式2: 创建接口的非匿名实现类的匿名对象

方式3: 创建接口的匿名实现类的非匿名对象

方式4: 创建接口的匿名实现类的匿名对象



相关问题推荐

  • 回答 3

    换行。比如,print hello\nworld效果就是helloworld\n就是一个换行符。\是转义的意思,'\n'是换行,'\t'是tab,'\\'是,\ 是在编写程序中句子太长百,人为换行后加上\但print出来是一整行。...

  • 回答 42

    十种常见排序算法一般分为以下几种:(1)非线性时间比较类排序:a. 交换类排序(快速排序、冒泡排序)b. 插入类排序(简单插入排序、希尔排序)c. 选择类排序(简单选择排序、堆排序)d. 归并排序(二路归并排序、多路归并排序)(2)线性时间非比较类排序:...

  • 回答 70
    已采纳

    前景很好,中国正在产业升级,工业机器人和人工智能方面都会是强烈的热点,而且正好是在3~5年以后的时间。难度,肯定高,要求你有创新的思维能力,高数中的微积分、数列等等必须得非常好,软件编程(基础的应用最广泛的语言:C/C++)必须得很好,微电子(数字电...

  • 回答 28

    迭代器与生成器的区别:(1)生成器:生成器本质上就是一个函数,它记住了上一次返回时在函数体中的位置。对生成器函数的第二次(或第n次)调用,跳转到函数上一次挂起的位置。而且记录了程序执行的上下文。生成器不仅记住了它的数据状态,生成器还记住了程序...

  • 回答 9

    python中title( )属于python中字符串函数,返回’标题化‘的字符串,就是单词的开头为大写,其余为小写

  • 回答 6

    第一种解释:代码中的cnt是count的简称,一种电脑计算机内部的数学函数的名字,在Excel办公软件中计算参数列表中的数字项的个数;在数据库( sq| server或者access )中可以用来统计符合条件的数据条数。函数COUNT在计数时,将把数值型的数字计算进去;但是...

  • 回答 1

    head是方法,所以需要取小括号,即dataset.head()显示的则是前5行。data[:, :-1]和data[:, -1]。另外,如果想通过位置取数据,请使用iloc,即dataset.iloc[:, :-1]和dataset.iloc[:, -1],前者表示的是取所有行,但不包括最后一列的数据,结果是个DataFrame。...

  • Python入门简单吗2021-09-23 13:21
    回答 45

    挺简单的,其实课程内容没有我们想象的那么难、像我之前同学,完全零基础,培训了半年,直接出来就工作了,人家还在北京大公司上班,一个月15k,实力老厉害了

  • 回答 4

    Python针对众多的类型,提供了众多的内建函数来处理(内建是相对于导入import来说的,后面学习到包package时,将会介绍),这些内建函数功用在于其往往可对多种类型对象进行类似的操作,即多种类型对象的共有的操作;如果某种操作只对特殊的某一类对象可行,Pyt...

  • 回答 8

     相当于 ... 这里不是注释

  • 回答 4

    还有FIXME

  • 回答 3

    python的两个库:xlrd和xlutils。 xlrd打开excel,但是打开的excel并不能直接写入数据,需要用xlutils主要是复制一份出来,实现后续的写入功能。

  • 回答 8

    单行注释:Python中的单行注释一般是以#开头的,#右边的文字都会被当做解释说明的内容,不会被当做执行的程序。为了保证代码的可读性,一般会在#后面加一两个空格然后在编写解释内容。示例:#  单行注释print(hello world)注释可以放在代码上面也可以放在代...

  • 回答 2

    主要是按行读取,然后就是写出判断逻辑来勘测行是否为注视行,空行,编码行其他的:import linecachefile=open('3_2.txt','r')linecount=len(file.readlines())linecache.getline('3_2.txt',linecount)这样做的过程中发现一个问题,...

  • 回答 4

    或许是里面有没被注释的代码

  • 回答 26

    自学的话要看个人情况,可以先在B站找一下视频看一下

没有解决我的问题,去提问