【问题标题】:Why long output gets truncated when using popen in ruby?为什么在 ruby​​ 中使用 popen 时长输出会被截断?
【发布时间】:2018-03-07 14:36:20
【问题描述】:

我运行了一个脚本,它在标准输出上返回一个长 JSON,但显然它被截断了:

res = ''
Open3.popen2('node script.js') {|i,o,t|
  while line = o.gets
    res = res + line
  end
}
puts res # it is truncated

为什么?如何避免?

【问题讨论】:

  • IO.gets 在文件末尾调用时返回nil。我不知道Open3.popen2 是如何处理流的,但看起来它认为node 已经刷新了输出。
  • 如果我们能重现这一点,将会有很大帮助。你能做一个minimal reproducible example吗?
  • 为什么不只是res = o.read?
  • 请注意,res << line 比 res = res + line 更有效,因为它附加到现有字符串而不是创建一个全新的字符串。

标签: ruby popen


【解决方案1】:

您可能会遇到node 将其标准输出传送到另一个进程的已知问题。这只是一个有根据的猜测,因为我不知道您的 node 脚本在做什么。

问题:

如果您尝试使用fs.open+fs.write 或fs.openSync+fs.writeSync 写入stdout,则输出可能不完整,因此您可能需要添加额外的逻辑来写入剩余部分。

基于this nodejs github comment,将缓冲区完全写入stdout 的推荐方法是

process.stdout.write(chunk[, encoding][, callback])

有关此功能的详细信息,请参阅Stream API。上面的 github 链接有更多关于使用 fs.write/fs.writeSync 的问题的解释。

我已经测试了process.stdout.write - 到管道标准输出。甚至一个 16 MB 的字符串也被完全写入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多