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 = "
// 設定傳遞給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