错误:在尝试使用node-pty启动伪终端时,posix_spawnp调用失败

后端开发 2026-07-10

我正在尝试用Electron和 node-pty构建一个简单的终端模拟器。

但应用启动时,它会立即崩溃,错误信息为

(node:51806) UnhandledPromiseRejectionWarning: Error: posix_spawnp failed.
    at new UnixTerminal (/Users/fredericlang/projets/perso/opencommand/node_modules/node-pty/lib/unixTerminal.js:92:24)
    at spawn (/Users/fredericlang/projets/perso/opencommand/node_modules/node-pty/lib/index.js:30:12)
    at /Users/fredericlang/projets/perso/opencommand/main.js:23:22

我的应用主进程的代码很简单:

const { app, BrowserWindow, ipcMain } = require('electron/main')
const path = require('node:path')
const pty = require('node-pty');
const os = require('os');

const shell = os.platform() === 'win32' ? 'powershell.exe' : 'bash';

let win;

const createWindow = () => {
  win = new BrowserWindow({
    width: 1500,
    height: 800,
    webPreferences: {
      preload: path.join(__dirname, 'preload.js')
    }
  })

  win.loadFile('index.html')
}

app.whenReady().then(() => {
  const ptyProcess = pty.spawn(shell, [], {
    name: 'xterm-color',
    cols: 80,
    rows: 30,
    cwd: process.env.HOME,
    env: process.env
  });

  ptyProcess.onData((data) => {
    win.webContents.send('terminal-response', data);
  });

  ipcMain.handle('ping', () => 'pong');
  ipcMain.handle('run-command', async (event, command) => {
    try {
      ptyProcess.write(command + '\r');
    }
    catch (error) {
      console.error('Error running command:', error);
      throw error; // Rethrow the error to be caught in the renderer process
    }
    return true; // Return a value to indicate the command was received
  });
  createWindow()

  app.on('activate', () => {
    if (BrowserWindow.getAllWindows().length === 0) {
      createWindow()
    }
  })
})

app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {}
  app.quit()
})

我在macOS 26.3.1上使用Electron版本41.2.0和 node-pty版本1.1.0。

我对Electron和 node-pty的使用相当基础,所以到目前为止我还不知道具体缺了什么。它不应是由pty基数的最大值触发的,因为我只启动了一个Pty。

解决方案

最终我通过以下方法解决了这个错误:

npm install --save-dev @electron/rebuild
npx @electron/rebuild

问题出在二进制不匹配。'node-pty' 是为标准的Node.js编译的,但Electron内置了自己的Node。必须为Electron重新编译 'node-pty'。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章