1. 程式人生 > >jython環境安裝、java呼叫python、中文亂碼問題

jython環境安裝、java呼叫python、中文亂碼問題

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 = "

[email protected]";
        
        // 設定傳遞給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="[email protected]";
        
        //設定中文編碼方式
        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