Java和Python的结合运用

简介: Java和Python的结合运用

直接通过Runtime进行调用
我们知道,在Java中如果需要调用第三方程序,可以直接通过Runtime实现,这也是最直接最粗暴的做法。

public class InvokeByRuntime {
/**

 * @param args
 * @throws IOException 
 * @throws InterruptedException 
 */
public static void main(String[] args) throws IOException, InterruptedException {
    String exe = "python";
    String command = "D:\\calculator_simple.py";
    String num1 = "1";
    String num2 = "2";
    String[] cmdArr = new String[] {exe, command, num1, num2};
    Process process = Runtime.getRuntime().exec(cmdArr);
    InputStream is = process.getInputStream();
    DataInputStream dis = new DataInputStream(is);
    String str = dis.readLine();
    process.waitFor();
    System.out.println(str);

//代码效果参考:https://v.youku.com/v_show/id_XNjQwNjgzNTEwNA==.html

}

}
输出:

3
calculator_simple.py:

coding=utf-8

from sys import argv

num1 = argv[1]
num2 = argv[2]
sum = int(num1) + int(num2)
print sum
显然,在Java中通过Runtime调用Python程序与直接执行Python程序的效果是一样的,可以在Python中读取传递的参数,也可以在Java中读取到Python的执行结果。需要注意的是,不能在Python中通过return语句返回结果,只能将返回值写入到标准输出流中,然后在Java中通过标准输入流读取Python的输出值。

通过Jython调用
通过Jython调用Python?我在听到这个概念的时候一脸懵逼,不是说好的在Java中调用Python程序吗?这个Jython是什么鬼?难道是一个在Java中调用Python程序的组件或工具?其实,关于Jython是什么这个疑问,我估计有许多人在一开始接触的时候也是很疑惑的,下面我们就一一道来。

  1. 什么是Jython
    Jython主页:http://www.jython.org/currentdocs.html
    按照官方的定义,Jython是Python语言在Java平台的实现。这个概念似乎有点拗口,反正我一开始并没有理解。Python难道不已经是一门语言了吗?什么叫做Jython是Python语言在Java平台的实现?
    实际上,之所以存在这样的困惑主要是因为我们对Python语言的相关概念掌握和理解不清楚导致的。
    Python其实只是一个语言规范,它存在多个不同语言实现的版本。具体来说,目前Python语言存在如下几个具体实现:
    (1)CPython:CPython是标准Python,也是其他Python编译器的参考实现。通常提到“Python”一词,都是指CPython。CPython由C编写,将Python源码编译成CPython字节码,由虚拟机解释执行。没有用到JIT等技术,垃圾回收方面采用的是引用计数。
    (2)Jython:Jython是在JVM上实现的Python,由Java编写。Jython将Python源码编译成JVM字节码,由JVM执行对应的字节码。因此能很好的与JVM集成,比如利用JVM的垃圾回收和JIT,直接导入并调用JVM上其他语言编写的库和函数。
    (3)IronPython:IronPython与Jython类似,所不同的是IronPython在CLR上实现的Python,即面向.NET平台,由C#编写。IronPython将源码编译成TODO CLR,同样能很好的与.NET平台集成。即与Jython相同,可以利用.NET框架的JIT、垃圾回收等功能,能导入并调用.NET上其他语言编写的库和函数。IronPython默认使用Unicode字符串。
    (4)PyPy:这里说的PyPy是指使用RPython实现,利用Tracing JIT技术实现的Python,而不是RPython工具链。PyPy可以选择多种垃圾回收方式,如标记清除、标记压缩、分代等。
    (5)Pyston:Pyston由Dropbox开发,使用C++11编写,采用Method-at-a-time-JIT和Mark Sweep——Stop the World的GC技术。Pyston使用类似JavaScript V8那样的多层编译,其中也用到了LLVM来优化代码。

所以,我们现在再来理解什么是Jython就非常清楚了:Jython是Python语言规范在Java平台的具体实现。具体来说,可以将Python源码编译为JVM可以解释执行的字节码。
Jython原本叫做JPython,于1997年由Jim Hugunin创建,后来在1999年2.0版本发布的时候由Barry Warsaw更名为Jython,在这里我们就不再深究为什么要把JPython更名为Jython的原因了。注意: Jython从2.0版本开始就与CPython的版本保持一致,即:Jython 2.7与CPython 2.7保持对应。

虽然我们理解了什么是Jython,但是还存在一个疑问,为什么Python语言存在这么多不同语言的实现呢?为什么不能就只存在一个C语言实现的版本就可以了呢?存在这么多版本,真的给初学者带来了许多困惑。
当然,要回答这个问题可能就需要深究一些历史的原因了,就此打住。我们在此只讨论使用Jython能做什么以及如何使用Jython?

  1. 使用Jython能做什么
    既然Jython是Python语言在Java平台的实现,是Java语言实现的,那么是否可以在Jython程序中调用Java,在Java中也能调用Jython呢?
    答案是肯定的,实际上,Jython的主要通途就是在Java中调用Python程序;而且,还可以直接在Jython程序中引用Java。

  2. 如何使用Jython
    3.1 安装Jython
    在Jython的官方下载页面我们可以看到如下描述(详见:http://www.jython.org/downloads.html)

显然,可以下载2个Jython的jar包。其中,jython-installer-${version}.jar是用于安装Jython的,jython-standalone-${version}.jar用于嵌入到Java程序中使用。
什么意思?我一开始也是很疑惑,为什么要提供2个不同的jar包呢?他们有什么不同呢?2个不同的Jar包如何使用呢?
首先,jython-installer-${version}.jar用于安装Jython,就好比我们需要安装JRE,用于运行Java程序。除此之外,当需要在Python程序中引用一些公共的第三方库时,也需要先安装Jython才能下载所依赖的模块。

下载jython-installer-${version}.jar完毕之后,进入控制台,执行如下命令:

java -jar jython-installer-${version}.jar
此时会弹出一个图形化的安装界面,只需要一步一步选择相应参数进行安装即可。安装完毕之后,请将Jython安装目录添加为环境变量JYTHON_HOME,同时添加bin目录到PATH变量中:PATH=$PATH:$JYTHON_HOME/bin。
进入控制台,执行如下命令就可以进入Jython的交互环境,这与CPython(我们通常说的Python)的命令行交互环境是一样的。

jython
Jython 2.7.0 (default:9987c746f838, Apr 29 2015, 02:25:11)
[Java HotSpot(TM) 64-Bit Server VM (Oracle Corporation)] on java1.8.0_121
//代码效果参考:https://v.youku.com/v_show/id_XNjQwNjg0MTIzNg==.html

Type "help", "copyright", "credits" or "license" for more information.

print("hello,world")
hello,world

当然,我们还可以使用jython命令运行一个Python程序。

jython helloworld.py
hello,world
helloworld.py:

import sys

print("hello,world")
上面我们看到在Jython官网提供了2个Jar包,一个用于安装Jython,执行Python程序。那么,jython-standalone-${version}.jar又有什么用途呢?
实际上,当我们需要在Java中调用Python程序时,除了直接使用Java的Runtime调用,还可以直接使用Jython的API进行调用,而且通过Jython API可以直接调用Python程序中的指定函数或者对象方法,粒度更加精细。
当我们需要调用Jython的API时有两种方式:
第一,如果项目使用Maven进行构建,可以直接添加Jython的依赖配置到pom.xml文件中,如:


org.python
jython
2.7.0

第二,可以直接将jython-standalone-${version}.jar添加到项目classpath中,这样也可以调用Jython的相关API了。也就是说,jython-standalone-${version}.jar就是一个提供Jython API的jar独立jar包。

3.2 Java调用Python程序实践
Java通过Jython API调用Python程序,有几种用法:
(1)在Java中执行Python语句,相当于在Java中嵌入了Python程序,这种用法不常见,也没有太大的实际意义。

public static void main(String[] args) {
System.setProperty("python.home", "D:\jython2.7.0");
PythonInterpreter interp = new PythonInterpreter();
// 执行Python程序语句
interp.exec("import sys");
interp.set("a", new PyInteger(42));
interp.exec("print a");
interp.exec("x = 2+2");
PyObject x = interp.get("x");
System.out.println("x: " + x);
}
输出:

42
x: 4
(2)在Java中简单调用Python程序,不需要传递参数,也不需要获取返回值。

public static void main(String[] args) throws IOException {
System.setProperty("python.home", "D:\jython2.7.0");
String python = "D:\simple_python.py";
PythonInterpreter interp = new PythonInterpreter();
interp.execfile(python);
interp.cleanup();
interp.close();
}

相关文章
|
7月前
|
机器学习/深度学习 JSON Java
Java调用Python的5种实用方案:从简单到进阶的全场景解析
在机器学习与大数据融合背景下,Java与Python协同开发成为企业常见需求。本文通过真实案例解析5种主流调用方案,涵盖脚本调用到微服务架构,助力开发者根据业务场景选择最优方案,提升开发效率与系统性能。
1752 0
|
JavaScript 前端开发 Java
通义灵码 Rules 库合集来了,覆盖Java、TypeScript、Python、Go、JavaScript 等
通义灵码新上的外挂 Project Rules 获得了开发者的一致好评:最小成本适配我的开发风格、相当把团队经验沉淀下来,是个很好功能……
1887 103
|
7月前
|
jenkins Shell 测试技术
|
7月前
|
安全 jenkins Java
Java、Python、C++支持jenkins和SonarQube(一)
Jenkins 是一个开源的 持续集成(CI)和持续交付(CD) 工具,用于自动化构建、测试和部署软件项目。它基于 Java 开发,支持跨平台运行,并拥有丰富的插件生态系统,可以灵活地扩展功能
475 5
|
7月前
|
jenkins Java Shell
Java、Python、C++支持jenkins和SonarQube(全集)
Jenkins 是一个开源的持续集成(CI)和持续交付(CD)工具,用于自动化构建、测试和部署软件项目。它基于 Java 开发,支持跨平台运行,并拥有丰富的插件生态系统,可以灵活地扩展功能
666 1
|
7月前
|
jenkins Java 持续交付
Java、Python、C++支持Jenkins和SonarQube(三)
Python与Jenkins和SonarQube
364 1
|
7月前
|
jenkins Java 测试技术
|
人工智能 安全 Java
Java和Python在企业中的应用情况
Java和Python在企业中的应用情况
467 7
|
11月前
|
数据采集 自然语言处理 Java
Playwright 多语言一体化——Python/Java/.NET 全栈采集实战
本文以反面教材形式,剖析了在使用 Playwright 爬取懂车帝车友圈问答数据时常见的配置错误(如未设置代理、Cookie 和 User-Agent),并提供了 Python、Java 和 .NET 三种语言的修复代码示例。通过错误示例 → 问题剖析 → 修复过程 → 总结教训的完整流程,帮助读者掌握如何正确配置爬虫代理及其它必要参数,避免 IP 封禁和反爬检测,实现高效数据采集与分析。
688 3
Playwright 多语言一体化——Python/Java/.NET 全栈采集实战
|
9月前
|
人工智能 Java 测试技术
Java or Python?测试开发工程师如何选择合适的编程语言?
测试工程师如何选择编程语言?Java 还是 Python?多位资深专家分享建议:Python 入门简单、开发效率高,适合新手及自动化测试;Java 生态成熟,适合大型项目和平台开发。建议结合公司技术栈、个人基础及发展方向选择。长远来看,两者兼通更佳,同时关注 Go 等新兴语言。快速学习与实践才是关键。

推荐镜像

更多