您的位置:首页 > 编程语言 > Python开发

Java调用Python脚本,以及报错解决

2017-12-11 11:35 525 查看


极少数时候,我们会碰到类似这样的问题:与 A 同学合作写代码, A 同学只会写 Python,而不熟悉 Java,而你只会写 Java 并不擅长 Python,并且发现难以用 Java 来重写对方的代码,这时,就不得不想方设法“调用对方的代码”。下面举一些简单的小例子,借此说明:如何在 Java 中调用 Python 代码。


什么是 Jython? 

Jython(原 JPython ),可以理解为一个由 Java 语言编写的 Python 解释器。

要使用 Jython, 只需要将 Jython-x.x.x.jar 文件置于 classpath 中即可 --> 官网下载,百度网盘。

当然,通过 Maven 导入也 OK
<dependency>
   <groupId>org.python</groupId>   <artifactId>jython-standalone</artifactId>   <version>2.7.0</version>
</dependency>


一个 HelloPython 程序,在java中执行Python语句

import org.python.util.PythonInterpreter;

public class HelloPython {

    public static void main(String[] args) {

        PythonInterpreter interpreter = new PythonInterpreter();

        interpreter.exec("print('hello')");

    }

}


什么是 PythonInterpreter 呢?它的中文意思即“ Python 解释器”。我们知道 Python 程序都是通过解释器执行的,上面的代码就是在 JVM 中创建一个“ Python 解释器”对象,模拟 Python 解释器的行为,通过 exec(" Python 语句") 直接在 JVM 中执行 Python 代码,上面代码的输出结果为:hello,需要提醒各位的是,该程序运行速度相较正常的 Java or Python 程序都要慢那么一点。


在 JVM 中执行 Python 脚本

interpreter.execfile("D:/labs/mytest/hello.py");  


如上,将 exec 改为 execfile 就可以了。需要注意的是,这个 .py 文件不能含有第三方模块,因为这个“ Python 脚本”最终还是在 JVM 环境下执行的(而非依赖于本地计算机环境),如果 .py 程序中有用到第三方模块(例如 NumPy)将会报错:java ImportError: No module named xxx

但是实际中,我们即使引入了Jytho-jar还是会报错

出现如下错误:



请点击此处输入图片描述


怎么解决呢?

在main方法中加入以下代码重构
Properties props = new Properties();
props.put("python.home", "path to the Lib folder");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]);


把全部代码贴出来

package com.aidongsports.test;
import org.python.util.PythonInterpreter;import java.util.Properties;/** * Created by HONGLINCHEN on 2017/12/11 11:15 * 测试java调用python * @author HONGLINCHEN * @since JDK 1.8 */public class TestPython {public static void main(String[] args) {Properties props = new Properties();props.put("python.home", "path to the Lib folder");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();/*在 JVM 中执行 Python 语句*/interpreter.exec("print('hello')");/*在 JVM 中执行 Python 脚本,这个 .py 文件不能含有第三方模块*/interpreter.execfile("E:\\TortoiseSVN\\trunk\\lovesports\\src\\main\\java\\com\\aidongsports\\test\\index.py");}}

index.py代码:
#!C:\Program Files\Python35
# coding=utf-8
a = input("Press the enter key to exit.\n\n")

# 将input方法返回的字符串转成int类型
a = int(a) # 第二个注释

if a <= 60:
print("成绩不及格") # 缩进4行,要是4的倍数
elif a == 60:
print("成绩及格")
elif a == 70:
print("成绩一般")
elif a == 90:
print("成绩优秀")

'''
print("Hello, Python!")
'''
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: