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