python通常在编程中难以单独的完成一个系统,因此在开发中常常需要借助其他语言开发主要程序,使用python对数据进行处理。
在通过java向python传递数据的时候通常是一些小的数据,例如:字符串、数组、数字等,如果想向python传递图片、视频、音频时通常传递的时其路径。
java调用python通常有三种方式:直接写在Java程序中,不常用;通过java调用;通过Runtime.getRuntime()调用。
方法一代码如下:
import org.python.util.PythonInterpreter;
public class content {
public static void main(String[] args) {
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.exec("a=[5,2,3,9,4,0]; ");
interpreter.exec("b=[5,2,3,9,4,0]; ");
interpreter.exec("c=a+b; ");
interpreter.exec("print(sorted(c));"); //此处python语句是3.x版本的语法
}
}
方法二:此方法不适用于python中调用第三方库,更改代码中的python脚本路径即可
import org.python.core.PyFunction;
import org.python.core.PyInteger;
import org.python.core.PyObject;
import org.python.util.PythonInterpreter;
public class diaoyong {
public static void main(String[] args) {
// TODO Auto-generated method stub
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.execfile("C:\\Users\\Administrator.ZJZL-20180706GA\\PycharmProjects\\untitled\\test.py");
// 第一个参数为期望获得的函数(变量)的名字,第二个参数为期望返回的对象类型
PyFunction pyFunction = interpreter.get("add", PyFunction.class);
int a = 5, b = 10;
//调用函数,如果函数需要参数,在Java中必须先将参数转化为对应的“Python类型”
PyObject pyobj = pyFunction.__call__(new PyInteger(a), new PyInteger(b));
System.out.println("the anwser is: " + pyobj);
}
}
test,python代码:
def add(a,b):
return a + b
方法三:
package com.test.python;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class disanfang {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Process proc;
try {
//2,3分别为两个参数
proc = Runtime.getRuntime().exec("python C:\\Users\\Administrator.ZJZL-20180706GA\\PycharmProjects\\untitled\\detect\\dlib人脸检测.py",2,3);
// 执行py文件
//用输入输出流来截取结果
BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = null;
//获取返回值
while ((line = in.readLine()) != null) {
System.out.println(line);
}
in.close();
proc.waitFor();
System.out.println("代码执行完成1");
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
改代码相当于将python代码放在控制台执行改代码,在传递参数时也应在python端编写相应的参数节后语句,在传递文件时只可以传递文件的路径即可
import sys
def a(c,d):
return c+d
a(sys.argv[1],sys.argv[2])