jython环境安装、java调用python、中文乱码问题

本文详细介绍了Jython的安装步骤及环境配置,通过示例代码演示了如何在Java中调用Python脚本、方法和类,解决了常见编码问题,适用于跨语言编程需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、jython安装


jython下载地址
http://www.jython.org/downloads.html

(1)直接双击“jython-installer-2.7.0.jar”一步步安装即可
(2)配置环境变量,
    新建系统环境变量:  JYTHON_HOME=D:\jython2.7.0
    在Path后添加变量(注意分号):  %JYTHON_HOME%\bin;%JYTHON_HOME%\Lib;
    在CLASSPATH:  %JYTHON_HOME%\jython.jar

2、测试安装是否成功


// 在dos中输入jython,如果出现jython的版本信息,并进入了jython,表明安装成功

(1)建立工程
(2)将jython-standalone-2.7.0.jar添加到工程中
(3)简单测试代码
public class FirstPythonToJava {
    public static void main(String[] args) {
        PythonInterpreter pj = new PythonInterpreter();
        pj.exec("print('first python to java')");
    }
}
// 如果出现“first python to java”表明成功


(4)出现的问题
如果出现“java.nio.charset.UnsupportedCharsetException: cp0”问题,运行时在 Run As->Run Configurations->Arguments->VM arguments 中添加下面一行
-Dpython.console.encoding=UTF-8

3、工程测试


# 相应的工程请参见:https://github.com/MasonYyp/pythonToJava.git

(1)java部分代码

    // 执行python文件
    public void execPythonFile() {
        //此方法运行速度快,可以运行导入的第三方库
        //此处,我没找到中文乱码的解决方法
        String language = "python";
        String path = "./python/python_src/my_file_python.py";
        String name = "lisi";
        String age = "1";
        String sex = "man";
        String email = "ruiaixinan@sina.com";
        
        // 设置传递给python的参数
        String[] arguments = new String[] {language, path, name, age, sex, email};
        
        try {
            Process process = Runtime.getRuntime().exec(arguments);
        
            BufferedReader buffData = new BufferedReader(new InputStreamReader(process.getInputStream()));
            String line = null;
            while ((line = buffData.readLine()) != null) {
                System.out.println(line);    
            }  
            buffData.close();
            
            try {
                //检查是否成功运行
                int re = process.waitFor();
                System.out.println(re);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
    
    public void execPythonMethod() {
        // 这种方法运行速度比较慢,不可以使用第三方库
        
        // 建立解析器
        PythonInterpreter pinter = new PythonInterpreter();
        // exec执行python代码
        pinter.exec("print('python to java')");
        
        // execfile执行python文件
        pinter.execfile("./python/python_src/my_method_python.py");
        
        // 获取文件中的函数
        PyFunction function = (PyFunction)pinter.get("say_information",PyFunction.class);
        String name = "王五";
        int age = 1;
        String sex = "男";
        String email="ruiaixinan@sin.com";
        
        //设置中文编码方式
        PyString PyName=Py.newStringUTF8(name);
        //如果不设置中文编码方式,name中有中文,则下面的代码会报错
        //PyString PyName=new PyString(name);
        
        PyString PySex=Py.newStringUTF8(sex);
        PyInteger Pyage=new PyInteger(age);
        PyString PyEmail=new PyString(email);
        
        //调用Python中的方法
        PyObject pyobject = function.__call__(PyName, Pyage, PySex, PyEmail);
        
        try {
            // 设置对返回的中文解码,在python中不需要设置中文编码方式
            String result = new String(pyobject.toString().getBytes("iso8859-1"), "utf-8");
            System.out.println("Success = " + result);
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
    
    // 执行python类
    public void execPythonClass() {
        // 这种方法运行速度比较慢,不可以使用第三方库
        
        // 建立解析器
        PythonInterpreter pinter = new PythonInterpreter();
        
        // execfile执行python文件
        pinter.execfile("./python/python_src/my_class_python.py");
        
        // python实例化对象名
        String pyEntityObjName = "person";
        // Python类名
        String pyObjName = "Person";
        // 实例 Python对象,并初始化类参数
        pinter.exec(pyEntityObjName + "=" + pyObjName + "('zhaoliu', 2, 'woman')");
        
        //获取Python实例化对象
        PyObject pyObj = pinter.get(pyEntityObjName);
        
        //获得对象中的方法
        PyObject infor = pyObj.invoke("sayMyInformation");
        System.out.println(infor.toString());
        
        //调用用参数的方法,并设置中文编码
        pyObj.invoke("set_name",new PyObject[] {Py.newStringUTF8("赵六")});
        PyObject name = pyObj.invoke("get_name");
        
        try {
            String result = new String(name.toString().getBytes("iso8859-1"), "utf-8");
            System.out.println(result);
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }        
    }

(2)Python部分代码

# my_file_python
def say_information(name, age, sex, email):
    print(name)
    print(age)
    print(sex)
    print(email)
    return 0

def say_job():
    data=[1,2,3,4]
    data=np.array(data);
    print(data)
    job="I am IT"
    print(job)
    return job


if __name__ == "__main__":
    # sys.argv获取从java获得参数
    say_information(sys.argv[0],sys.argv[1],sys.argv[2],sys.argv[3])
    say_job()

# My_class_python.py

class Person:
    
    __name="张三";
    __age=0
    __sex='男'
    
    def set_name(self, name):
        self.__name = name
    def set_age(self, age):
        self.__age = age
    def set_sex(self, sex):
        self.__sex = sex
    
    def get_name(self):
        return self.__name
    def get_age(self):
        return self.__age
    def get_sex(self):
        return self.__sex
    
    # 初始化数据
    def __init__(self, name, age, sex):
        self.set_name(name)
        self.set_age(age)
        self.set_sex(sex)
    
    # 显示个人信息
    def sayMyInformation(self):
        print(self.get_name())
        print(self.get_age())
        print(self.get_sex())
        return 0

# my_method_python.py
def say_information(name, age, sex, email):
    print(name)
    print(age)
    print(sex)
    print(email)
    job="我是IT男"
    '''
    data=[1,2,3,4]
    data=np.array(data);
    '''
    return job

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值