通过flask服务启动c++程序,网上查到的方案有使用ctypes库对c++代码进行重构,或者通过cmake将算法服务编译为libtest.so。但不想有太麻烦的操作,还想在windows上直接运行,所以想到直接用flask的subprocess来启动命令行执行c++程序。
方法:先贴上我的代码
@app.route('/ECTSServer', methods=['POST', 'GET'])
def ECTS_run():
#t = GetSellThread()
#t.start()
a = "-d"
b = "sell1.txt"
c = "pred.txt"
s = subprocess.run(["./bin/ects", a, b ,c],stdout=PIPE)
print(s)
return s.stdout.decode("utf-8")
1、首先确保flask和要执行的c++可执行文件都在本地可以访问
2、通过subprocess.run创建子进程运行命令行,如果我们想在命令行输入的命令是./bin/ects -d sell1.txt pred.txt。那么就在[ ]里面写这句命令,但方括号里每一个元素都不能包含空格,所以命令行就被拆解成4个部分(如果整体输入会报错)。
3、stdout是c++程序的cout内容,通过subprocess的PIPE进行捕获from subprocess import PIPE,可以通过flask返回给前端。
4、启动flask,发送请求后,可以看到c++程序被运行了
10.37.18.119 - - [23/May/2022 20:01:45] "GET /ECTSServer HTTP/1.1" 200 - CompletedProcess(args=['./bin/ects', '-d', 'sell1.txt', 'pred.txt'], returncode=0, stdout=b'0rn')
ps:本来想通过cpp-httplib来代替flask框架写c++服务,但是因为cmake的一些依赖问题一直出错,所以只能用这种笨方法代替,因为此处已经通过g++编译好了cpp的可执行文件,我们运行的只是可执行文件(并没有编译过程,如果代码更新还需要离线编译),此方法有什么弊端还需后续发现。



