【问题标题】:Open executable and manage its streams?打开可执行文件并管理其流?
【发布时间】:2013-10-14 06:47:52
【问题描述】:

出于测试目的,我正在尝试打开一个 Ruby 脚本,提示输入带有 popen3 的内容。

我需要能够输入进程的 STDIN 并检查输出。到目前为止,我有这个:

require 'open3'
def run(executable, opts = {})
  Signal.trap('CLD') do
    puts 'STDIN:', @stdout.readlines
    # @stderr.rewind
    puts 'STDERR:', @stderr.readlines
    # got EOF, trying to rewind gives me 'Errno::ESPIPE: Illegal seek'

    [@stdin, @stdout, @stderr].each &:close
  end

  @stdin, @stdout, @stderr, @thread = Open3.popen3(executable)
  @status = @thread.value
end

已经尝试了几天,我的大脑正在融化。

【问题讨论】:

  • 我建议您仅将其作为最后的努力 - 如果可能,请使用您的软件正在使用的同一库而不是午餐其他进程并尝试处理它。
  • 是的,事实证明这真的很难(而且很耗时)。但是,如果可以的话,我会回答。
  • readlines "blocks" 直到它读取所有输入,所以......可能使用其他东西......

标签: ruby io stream popen3


【解决方案1】:

您可以在信号处理程序中执行的操作非常有限。例如,you are not allowed to do I/O in a signal handler。众所周知,信号处理程序很容易出错。

您对使用Open3.capture* 有何看法?同时从 stdout 和 stderr 读取时,它避免了所有块/竞争条件。此外,它还允许您为标准输入传递数据。使用关键字参数:stdin_data

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    • 2015-09-04
    • 2012-02-03
    • 1970-01-01
    相关资源
    最近更新 更多