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

Flask subprocess.run调用Node.js脚本时import语法报错

问题根因

核心问题是Flask拉起的子进程调用的Node.js运行环境,和你手动在终端执行命令时的Node.js环境不一致:

  • 从报错堆栈中的internal/modules/cjs/loader.js路径可以判断,子进程调用的是v12及更早的旧版Node.js,这类版本默认只支持CommonJS模块规范,无法直接识别ESM格式的import语法,因此抛出语法错误。
  • 你手动在终端执行命令时,shell会自动加载当前用户的环境配置(比如nvm的版本切换配置、用户级PATH变量),调用的是你安装的高版本Node.js,高版本已支持ESM规范(配合项目下package.json的"type": "module"配置即可正常运行import语法),所以手动执行没有问题。
  • 之前的排查只验证了工作目录,没有核对子进程内Node可执行文件的实际路径和版本,因此没定位到差异。
解决方案

按落地成本从低到高选择即可:

  • 优先使用绝对路径指定Node可执行文件:
    先在正常运行脚本的终端里执行which node,拿到可用Node的完整路径(nvm安装的版本一般路径类似/home/verifier/.nvm/versions/node/v20.10.0/bin/node),将Flask代码中的调用命令替换为绝对路径调用,避免PATH查找偏差:
    # 替换为你实际which node输出的路径
    p = run("/home/verifier/.nvm/versions/node/v20.10.0/bin/node /home/verifier/verify.js",
            shell=True,
            stdout=PIPE,
            stderr=PIPE,
            universal_newlines=True)
    
  • 给子进程传递完整环境变量:
    导入os模块,将当前进程的完整环境变量传入子进程,避免子进程使用残缺的系统默认PATH找错Node版本:
    import os
    # 其余业务代码不变
    p = run("node /home/verifier/verify.js",
            shell=True,
            stdout=PIPE,
            stderr=PIPE,
            universal_newlines=True,
            env=os.environ.copy())
    
  • 适配CommonJS规范兼容全版本Node:
    如果不需要使用ESM特性,直接将脚本中的import语法改为CommonJS的require写法,新旧版本Node都可以直接运行:
    const axios = require('axios');
    console.log("axios import ok")
    

校验技巧:可以临时在Flask接口中执行node -v && which node命令,打印子进程识别到的Node版本和路径,和终端本地的执行结果对比,就能快速确认环境不一致的问题。

内容的提问来源于stack exchange,提问作者LegionOfBrad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 10:33:18