写在前面
在微服务架构大行其道的今天,对于将程序进行嵌套调用的做法其实并不可取,甚至显得有些愚蠢。当然,之所以要面对这个问题,或许是因为一些历史原因,或者仅仅是为了简单。恰好我在项目中就遇到了这个问题,需要在Java程序中调用Python程序。关于在Java中调用Python程序的实现,根据不同的用途可以使用多种不同的方法,在这里就将在Java中调用Python程序的方式做一个总结。
直接通过Runtime进行调用
我们知道,在Java中如果需要调用第三方程序,可以直接通过Runtime实现,这也是最直接最粗暴的做法。
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
public class InvokeByRuntime {
public static void main(String[] args) throws Exception {
String exe = "python";
String command = "E:\\my_projects\\py_lyh1\\java_run_python_test.py";
String num1 = "10";
String num2 = "20";
String[] cmdArr = new String[] {exe, command, num1, num2};
Process process = Runtime.getRuntime().exec(cmdArr);
InputStream is = process.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is));
String count;
while((count = bufferedReader.readLine()) != null){
System.out.println(count);
}
bufferedReader.close();
process.waitFor();
}
}
java_run_python_test.py:
# coding=utf-8
from sys import argv
num1 = argv[1]
num2 = argv[2]
sum_num = int(num1) + int(num2)
print(sum_num)
print('第一个参数:{0} 第二个参数:{1}'.format(num1, num2))
显然,在Java中通过Runtime调用Python程序与直接执行Python程序的效果是一样的,可以在Python中读取传递的参数,也可以在Java中读取到Python的执行结果。需要注意的是,不能在Python中通过return语句返回结果,只能将返回值写入到标准输出流中,然后在Java中通过标准输入流读取Python的输出值。
总结
虽然在Java中调用Python可以有多种方式解决,甚至因为Jython的出现更显得非常便利。但是这种程序间嵌套调用的方式不可取,首先抛开调用性能不说,增加了耦合复杂度。更加有效的方式应该是通过RCP或者RESTful接口进行解耦,这样各司其职,也便于扩展,良好的架构是一个项目能够健康发展的基础。在微服务架构大行其道的今天,这种程序间嵌套调用的方式将会逐渐被淘汰。
网友评论