我迅速从child_process切换到execa,因为我在Mac OS X上遇到了一些问题,其中child_process缓冲区限制为200kb(gcloud app deploy会发送一大块字符串> 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上的结果却不一样
我尝试了很多东西:
> execa()
> execa.shell()
> options shell:true
>我尝试将maxBuffer增加到1GB(以防万一)
>它适用于分离:true但我无法在应用程序中实时读取stdout / stderr,因为它提示新的cmd.exe而不与Node.js应用程序交互
>很多child_process变体.
我已经制作了一个GIST来显示我在Windows上使用基本Child Process脚本进行的一些测试所得到的响应:
https://gist.github.com/thyb/9b53b65c25cd964bbe962d8a9754e31f
我还在execa存储库中打开了一个问题:https://github.com/sindresorhus/execa/issues/97
有人已经解决了这个问题吗?我已经四处寻找,除了这个reddit thread没有解决这个问题之外没有找到任何希望.
从Node.js子进程运行Python脚本有一些已知问题.
他们在comment中讨论了python的无缓冲选项.通过添加-u选项更新gcloud.cmd中的shell脚本后,我发现一切都按预期工作
此comment解释了如何将此选项设置为环境变量(不直接修改Windows shell脚本):https://docs.python.org/2/using/cmdline.html#envvar-PYTHONUNBUFFERED
因此,将PYTHONUNBUFFERED添加到环境变量可以解决此问题!
execa(fullpath,{ cwd: appPath,env: Object.assign({},process.env,{ PYTHONUNBUFFERED: true }) })