每当我希望在 Ruby 中运行一些外部进程时,我都会编写如下内容:
output = `outer_process`
这很好用,进程的输出被放入“输出”。但有时该过程需要花费大量时间并提供大量输出,我希望在它停止运行之前在屏幕上看到它。有没有办法做到这一点?
每当我希望在 Ruby 中运行一些外部进程时,我都会编写如下内容:
output = `outer_process`
这很好用,进程的输出被放入“输出”。但有时该过程需要花费大量时间并提供大量输出,我希望在它停止运行之前在屏幕上看到它。有没有办法做到这一点?
看看open4
宝石。有一些限制,但假设您的进程有输出到 STDOUT,您可以执行以下操作:
Open4.open4( outer_process ) do | pid, pstdin, pstdout, pstderr |
pstdout.each { |line| puts line }
end
就底层机制而言,这与 Anand 在评论中的建议非常相似。
请注意,如果您调用的进程没有刷新 STDOUT,这将不会立即起作用。如果您需要解决该限制,您将需要为子进程提供一个终端,这在 Ruby 中是可能的,但更复杂 - 请参阅Continuously read from STDOUT of external process in Ruby的答案