错误:在尝试使用node-pty启动伪终端时,posix_spawnp调用失败
我正在尝试用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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。