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

Electron生产模式下Node.js spawn调用Python exe报ENOENT错误

解决Electron打包后无法运行asar内可执行文件的ENOENT错误

问题根源

Electron-builder打包后会将应用代码归档到app.asar文件中,系统无法直接识别并运行asar归档内部的可执行文件——哪怕你解压asar能看到esic.exe存在,child_process.spawn也无法正确定位并执行它,这就是生产模式下出现ENOENT错误的核心原因。

解决方案

1. 配置electron-builder,将exe排除在asar外

修改项目根目录的package.json,在build字段中添加extraResources配置,把esic.exe单独打包到应用的资源目录,而不是塞进asar里:

"build": {
  "extraResources": [
    {
      "from": "./dist/esic.exe",
      "to": "dist/esic.exe"
    }
  ]
}

这个配置会把项目中的dist/esic.exe复制到打包后应用的资源目录下的dist文件夹中。

2. 修改exe路径的获取逻辑

在主进程代码中,根据开发/生产模式切换路径:
首先引入依赖:

const { spawn } = require('child_process');
const path = require('path');
const isDev = require('electron-is-dev'); // 需先安装:npm install electron-is-dev --save

然后获取正确的exe路径:

// 区分开发/生产模式的路径
const exeLocation = isDev 
  ? path.join(__dirname, 'dist/esic.exe') 
  : path.join(process.resourcesPath, 'dist/esic.exe');

const childProcess = spawn(exeLocation, [args]); // 注意变量名不要用process,避免覆盖全局对象

补充说明

  • process.resourcesPath是Electron提供的全局变量,生产模式下指向应用的资源目录(Windows下通常为应用安装目录/resources),开发模式下指向项目根目录。
  • 生产模式下不要用__dirname获取路径,因为它指向的是asar内部的归档路径,系统无法直接访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 13:15:02