Python Flask应用调用C++可执行文件无响应问题求助
问题原因
- 参数类型错误:从表单拿到的参数为空时,代码将
node_id和file_name赋值为整数类型0,而subprocess.run要求传入的命令参数必须全部为字符串类型,类型不匹配可能导致C++程序接收参数异常。 - 错误流未捕获阻塞:仅配置了捕获标准输出
stdout=PIPE,没有处理标准错误流stderr,如果C++程序运行中向stderr输出内容,缓冲区满后会导致程序阻塞挂起,无返回。 - 工作目录不匹配:Flask启动时的工作目录如果和可执行文件
Ex02_DriveStatus所在目录不一致,相对路径./Ex02_DriveStatus会找不到目标文件,导致运行异常。 - 权限不足:C++程序需要操作CAN设备,终端直接运行时可能默认有对应权限,但Flask服务运行时如果没有root权限,会因无法访问CAN设备导致程序卡住。
- 无超时机制:C++程序如果运行出错进入死循环,没有超时限制会导致请求永远挂起。
解决方案
修改你的run函数如下:
def run(node_id, file_name): # 统一参数为字符串,设置合理默认值 node_id_str = str(node_id).strip() if str(node_id).strip() else "5" file_name_str = str(file_name).strip() if str(file_name).strip() else "blablabla.sw" # 拿到当前Python文件所在目录,保证可执行文件路径正确 current_dir = os.path.dirname(os.path.abspath(__file__)) exe_path = os.path.join(current_dir, "Ex02_DriveStatus") try: # 同时捕获stdout和stderr,添加30秒超时,指定工作目录 s = subprocess.run( [exe_path, node_id_str, file_name_str], stdout=PIPE, stderr=PIPE, cwd=current_dir, timeout=30 ) # 打印返回信息方便本地排查 print(f"返回码: {s.returncode}") print(f"标准输出: {s.stdout.decode('utf-8', errors='ignore')}") print(f"错误输出: {s.stderr.decode('utf-8', errors='ignore')}") # 合并输出返回给前端 return f"标准输出:\n{s.stdout.decode('utf-8', errors='ignore')}\n错误输出:\n{s.stderr.decode('utf-8', errors='ignore')}" except subprocess.TimeoutExpired as e: return f"运行超时: {str(e)}" except Exception as e: return f"运行出错: {str(e)}"
额外注意:
- 如果C++程序运行需要root权限操作CAN设备,启动Flask时需要用
sudo flask run命令启动,保证权限充足。 - 确认
Ex02_DriveStatus有可执行权限,没有的话先执行chmod +x Ex02_DriveStatus添加权限。
内容的提问来源于stack exchange,提问作者Camille Bouquet
相关产品推荐
相关产品推荐

