如何在Java中调用Python代码

在平时与同学或同事交流时,我们经常会碰到这样的问题,他只会用Python,而我只会用Java,但是我们又必须实现代码的互相调用,这时候该怎么办呢?别慌,事实上,我们可以借助一个非常强大的工具:Jython。

百度百科是这样说的:Jython是一种完整的语言,而不是一个Java翻译器或仅仅是一个Python编译器,它是一个Python语言在Java中的完全实现。Jython也有很多从CPython中继承的模块库。最有趣的事情是Jython不像CPython或其他任何高级语言,它提供了对其实现语言的一切存取。所以Jython不仅给你提供了Python的库,同时也提供了所有的Java类。这使其有一个巨大的资源库。

Jython的功能很强大,那我们该如何利用这一资源呢?接下来我来给大家展示一下我的探索吧。

一、Jython的安装与配置

首先我们来进行Jython的安装,下面是Jython的官方下载地址:
https://www.jython.org/download
页面上有两个安装包:
https://www.jython.org/installation
分别解释一下它们分别是什么:
1、Jython Installer 是用来安装Jython的,下载后在cmd中执行以下命令

java -jar jython-installer-${version}.jar

然后会跳出一系列的图形界面,一步步安装就可以啦。
安装完毕后,就需要将你的Jython安装目录添加为你的环境变量JYTHON_HOME,接着将你的bin目录添加到Path里面去。
至于检查是否安装成功,打开cmd,在你的Jython安装目录下执行jython即可,如下:
检查
如果出现一些warning,不要惊慌,这些无足轻重,但如果出现error而且并没有弹出Jython界面,那就需要检查一下环境变量是否添加正确。
2、Jython Standalone 非常方便,有了它你就不必安装Jython,只需在cmd中执行以下命令即可

java -jar jython-standalone-${version}.jar

但是如果你要在Java中使用Python的话,就必须安装Jython了。
至于具体安装说明请参考官方说明:
https://www.jython.org/installation

二、Maven的安装与配置

Jython已经安装好了,那么我们如何在实际Java程序中使用它呢?
这时候就需要借助一个强大的工具了:Maven。
Maven是一个Eclipse第三方安装包管理工具,有了它你就可以在Java程序中像Python那样调用各种第三方库了。
笔者提供以下三个Maven安装教程,它们基本可以帮助成功安装和配置好Maven:
https://www.cnblogs.com/yinzhengjie/p/9017416.html~
https://www.cnblogs.com/kyleinjava/p/9549481.html~
https://www.cnblogs.com/yaowen/p/8594876.html~

成功安装Maven之后,就到了实践环节了,在这之前需要做一些准备工作:
添加依赖:打开pom.xml文件,在<dependencies>……</dependencies>之间添加代码:

<dependency>
    <groupId>org.python</groupId>
    <artifactId>jython</artifactId>
    <version>2.7.0</version>
</dependency>

编写一个供Java调用的Python代码:
1、注意代码的第一行要添上一句#coding=UTF-8,否则Java调用时可能会出现编码错误;
2、注意Python代码里的输入提示以及输出最好都是英文,用中文的话在Java的输出里可能会乱码。

三、实际代码编写

话不多说,直接放代码吧:

import java.io.IOException;
import java.util.Properties;
import org.python.util.PythonInterpreter;

public class test {
 public static void main(String[] args) throws IOException {
  Properties props = new Properties();
  props.put("python.home", "F:\\Java\\jython\\jython2.7.1\\Lib");
  props.put("python.console.encoding", "UTF-8");        
  props.put("python.security.respectJavaAccessibility", "false");        
  props.put("python.import.site", "false");
  Properties preprops = System.getProperties();
  PythonInterpreter.initialize(preprops, props, new String[0]);
  PythonInterpreter interpreter = new PythonInterpreter();
  interpreter.exec("print('hello')");
  interpreter.execfile("E:\\python\\迭代求阶乘.py");
 }
}

输出:
输出
通过exec函数我们能直接在Java中执行Python语句,而通过execfile函数我们能直接调用Python脚本,非常方便。

但是以上的代码并不十全十美,比如被调用的Python代码中不能导入第三方库即不能有import,否则的话编译Java代码时会报错,那我们怎么解决呢?别着急,Java还提供了一种简单粗暴的办法,就是直接通过Runtime进行调用,它能帮助我们避免Python第三方库的问题,代码如下:

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;

public class spell {
 public static void main(String[] args) throws IOException, InterruptedException { 
  Scanner in = new Scanner(System.in);
  String str1 = in.next();
  String exe = "python";
  String command = "E:\\python\\spell.py";
  String[] cmdArr = new String[] {exe,command,str1};
  Process process = Runtime.getRuntime().exec(cmdArr);
  InputStream is = process.getInputStream();
  DataInputStream dis = new DataInputStream(is);
  String str2 = dis.readLine();        
  process.waitFor();
  System.out.println(str2);
 }
}

spell.py是笔者自己写的一个带第三方库的Python文件,它能返回所输入的汉字的拼音,输出如下:
输出
好了,文章就到这里结束了,笔者所写的是一些粗浅的尝试,其中可能有不少错误,还望大家指正。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐