SpringBoot调用python脚本及C++方法
一、调用Python脚本
- 使用下面的方法进行python脚本的调用
- pythonExePath是python解释器的路径,比如D:/python_venv/Scripts/python.exe
- pyFilePath是你要运行的py文件的路径,可以使用相对路径,比如./test_project/main.py
- pythonParams是自定义的要传输的变量,需要在python程序中进行设置
@SneakyThrows
public void usePython(String pythonExePath, String pyFilePath, String pythonParams) {
Process proc;
try {
proc = Runtime.getRuntime().exec(pythonExePath+" "+pyFilePath+pythonParams);
BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
in.close();
proc.waitFor();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
import argparse
from services.operate_satellite_data import OperateSatelliteData
from services.operate_log_data import OperateLogData
class SettingParams:
def __init__(self):
self.parser = argparse.ArgumentParser(description='setting python params')
self.args = None
def setting_params(self):
self.parser.add_argument('parse_type', choices=['satellite', 'log_compare'], type=str, help='处理类别')
self.parser.add_argument('-fp', '--file_path', type=str, help='文件路径')
self.parser.add_argument('-fn', '--file_name', type=str, help='文件名称')
self.parser.add_argument('-eft', '--export_file_type', choices=['json', 'txt', 'csv'], type=str, help='输出文件类别')
self.parser.add_argument('-efp', '--export_file_path', default='', type=str, help='输出文件路径')
self.parser.add_argument('-efn', '--export_file_name', type=str, help='输出文件名称')
self.args = self.parser.parse_args()
if self.args.export_file_path == '':
self.args.export_file_path = self.args.file_path
return self.args
if __name__ == '__main__':
args = SettingParams().setting_params()
if args is not None:
if args.parse_type == 'satellite':
pass
elif args.parse_type == 'log_compare':
pass
二、调用C++
- SpringBoot调用C++算法的话,可以通过调用动态库或可执行文件进行实现
2.1 调用C++打包好的Dll动态库
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.9.0</version>
</dependency>
package com.mbtxtq.app.mapper.dll;
import com.sun.jna.Library;
import com.sun.jna.Pointer;
public interface MyLibraryMapper extends Library {
public int GetHdNum1(int firstNum, int secondNum);
public boolean GetHardwareNum(String a, Pointer b);
public Pointer GetHdNumS(String data);
}
package com.mbtxtq.app.dao.dll;
import com.mbtxtq.app.mapper.dll.MyLibraryMapper;
import com.sun.jna.Memory;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import lombok.SneakyThrows;
import org.springframework.stereotype.Repository;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
@Repository
public class MyLibraryDataOperate {
@SneakyThrows
public Object useMyLibraryDll(String dllPath, String funcName, ArrayList<Object> paramArray) {
MyLibraryMapper myLibrary = Native.load(dllPath, MyLibraryMapper.class);
if (funcName.equals("GetHdNum1")) {
return myLibrary.GetHdNum1((Integer) paramArray.get(0), (Integer) paramArray.get(1));
} else if (funcName.equals("GetHdNumS")) {
Pointer result = myLibrary.GetHdNumS((String) paramArray.get(0));
StringBuilder data = new StringBuilder();
for (int i=0, length=1024; i < length; i++) {
String innerData = String.valueOf((char) result.getByteArray(0, 1024)[i]);
data.append(innerData);
}
return data.toString();
} else if (funcName.equals("GetHardwareNum")){
Pointer p = new Memory(1024);
boolean result = myLibrary.GetHardwareNum((String) paramArray.get(0), p);
StringBuilder data = new StringBuilder();
for (int i=0, length=1024; i < length; i++) {
String innerData = String.valueOf((char) p.getByteArray(0, 1024)[i]);
data.append(innerData);
}
return data.toString().getBytes(StandardCharsets.ISO_8859_1);
} else {
return null;
}
}
}
- 然后直接调用MyLibraryDataOperate里的useMyLibraryDll方法即可
2.2 调用C++打包好的exe可执行文件
public void openExe(FileNameAo fileName) throws IOException, InterruptedException {
Runtime runtime = Runtime.getRuntime();
String fName = fileName.getFileName();
runtime.exec("D:\\"+ fName +"\\" + fName + ".exe");
}