ruby:在原始模式下将击键发送到PTY

问题描述 投票:2回答:1

我正在尝试向ruby-newt模块添加更多自动化测试。我的代码似乎正常工作,但是仍然需要在终端上手动点击ENTER才能完成。

例如,在下面的代码中,\t将切换到下一个按钮,\r将按下按钮,并且两个命令都成功执行,但是仍然需要在终端上手动按下ENTER键,否则程序无限期地挂起。

如果注释掉wr.write "\t\r"行,则程序将超时并在10秒后成功退出。我已经尝试过wr.flush,但这无济于事。我也尝试在命令中包含\n

write命令中还应该包含其他什么内容以确保子程序成功收到它吗?

require 'newt'
require 'pty'

def newt_run
  begin
    Newt::Screen.new
    Newt::Screen.centered_window(20, 15, 'Button')

    b1 = Newt::Button.new(1, 1, 'Button1')
    b2 = Newt::Button.new(1, 6, 'Button2')

    b = Newt::Button.new(1, 11, 'Exit')

    f = Newt::Form.new
    f.set_timer(10000)
    f.add(b1, b2, b) 

    rv = f.run
  ensure
    Newt::Screen.finish
  end
end

master, slave = PTY.open
rd, wr = IO.pipe

if fork.nil? then
  master.close
  wr.close

  $stdin.reopen(rd)
  $stdout.reopen(slave)
  $stderr.reopen(slave)

  newt_run
else
  slave.close
  rd.close

  wr.write "\t\r"
  Process.wait
end
ruby pty
1个回答
0
投票
因此,您不能使用Ruby newt的当前实现来重定向stdin。

这里是问题:

Ruby t调用C-lib中的newtInit()

    [newtInit()呼叫SLang_init_tty
  1. SLang_init_tty始终默认将输入附加到/dev/tty
  • 如果您是read the documentation of SLang_init_tty,您会发现变量SLang_TT_Read_FD确定是否使用/dev/tty
  • 因此,解决方法是在从Ruby调用SLang_TT_Read_FD之前,您需要将stdin设置为newtInit()。>
  • © www.soinside.com 2019 - 2024. All rights reserved.