我正在构建一个Electron应用程序(Node.js),它需要从应用程序中生成gcloud app deploy
并提供实时反馈(stdin / stdout / stderr)。
我快速从child_process
切换到execa,因为我在Mac OS X上遇到了一些问题,其中child_process缓冲区限制为200kb(gcloud app deploy
发送了一大块字符串&gt ; 200kb使命令崩溃)。
现在,execa
一切似乎在OSX上正常运行,但在Windows上却没有。
代码看起来像这样:
let bin = `gcloud${/^win/.test(process.platform) ? '.cmd' : ''}`
//which: https://github.com/npm/node-which
which(bin, (err, fullpath) => {
let proc = execa(fullpath, ['app', 'deploy'], {
cwd: appPath
})
proc.stdout.on('data', data => {
parseDeploy(data.toString())
})
proc.stderr.on('data', data => {
parseDeploy(data.toString())
})
proc.then(() => {
...
}).catch(e => {
...
})
})
此代码在Mac OS X上完美运行,而我在Windows上的结果却不一样
我尝试了很多东西:
我已经制作了一个GIST来显示我在Windows上使用基本Child Process脚本完成的一些测试所得到的响应: https://gist.github.com/thyb/9b53b65c25cd964bbe962d8a9754e31f
我还在execa
存储库上打开了一个问题:https://github.com/sindresorhus/execa/issues/97
是否有人已经遇到此问题?我已经四处寻找并发现没有任何希望,除了这个reddit thread并没有解决这个问题。
答案 0 :(得分:1)
在幕后,gcloud.cmd正在运行一个python脚本。在阅读了ChildProcess / Python和Windows的大量Node.js问题后,我陷入了这个问题:https://github.com/nodejs/node-v0.x-archive/issues/8298
从Node.js子进程运行Python脚本存在一些已知问题。
他们在这个comment中谈论了python的无缓冲选项。通过添加gcloud.cmd
选项更新-u
中的shell脚本后,我注意到所有内容都按预期工作了
这个comment解释了如何将此选项设置为环境变量(不直接修改Windows shell脚本):https://docs.python.org/2/using/cmdline.html#envvar-PYTHONUNBUFFERED
因此,将PYTHONUNBUFFERED
添加到环境变量可以解决此问题!
execa(fullpath, ['app', 'deploy'], {
cwd: appPath,
env: Object.assign({}, process.env, {
PYTHONUNBUFFERED: true
})
})