You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 22:36:07