java调用python函数
项目中需要调用python编写的算法函数,需要在java工程中对py文件进行调研。在网上查到的资料大多数是使用jython。但是发现如果在python中引用其他包需要提前导入。
本方法参考Java代码中调用shell脚本和python脚本并获得输出结果(分为小数据量和大数据量),采取捕捉控制台输出的方法偷懒实现对python函数的调用。
python函数
用于测试的python函数如下:
import sys
def test(a,b):
if a>b:
print(True)
return True
else:
print(False)
return False
if __name__ == '__main__':
print(sys.argv)
test(int(sys.argv[1]),int(sys.argv[2]))
cmd测试
cmd命令
$ python e:\test.py 3 4
cmd输出
['e:\test.py', '3', '4']
False
其中sys.argv[index]用于获取控制台输入,包括文件名,因此参数index从1开始。
java函数
在java中捕捉控制台输出,也有用InputStream捕捉控制台输出的,本人未实现。
//代码原址参考引用,还有大量输出的多线程方法
public String python(String pythonPath, String[] params) {
File file = new File(pythonPath);
if (!file.exists()){
return "python脚本不存在!";
}
String[] command = Arrays.copyOf(new String[]{"python", pythonPath}, params.length + 2);
System.arraycopy(params, 0, command, 2, params.length);
List<String> res = new ArrayList<>();
try {
Process process = Runtime.getRuntime().exec(command, null, null);
process.waitFor();
Scanner scanner = new Scanner(process.getInputStream());
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
res.add(line);
}
} catch (Exception e) {
e.printStackTrace();
}
return "success";
}
经过测试,res成功输出与控制台相同内容。
当可以在python函数的return前print函数返回值,res的最后一行即为输出。