gpt4 book ai didi

Ruby IO 无法按预期在 Windows 上工作,随机卡在 put 和 read 上

转载 作者:太空宇宙 更新时间:2023-11-04 03:52:52 25 4
gpt4 key购买 nike

我正在尝试为学生的教程控制台应用程序编写一个简单的检查器。它应该在 Windows 下作为独立应用程序运行。

有了一些 Ruby 的经验,我编写了以下代码:

require 'yaml'
progs = YAML.load_file "test.yaml"
progs.each do |prog|
puts "running #{prog}..."
pn = prog["program"]
tc = 0
prog["tests"].each do |i, o|
tc += 1
puts "Test #{tc}:\n" #{i}\n=>\n#{o}\n--\n"
IO.popen(pn, "r+") do |pie|
#pie.sync = true
pie.puts i
#pie.flush
#pie.close_write
a = pie.read
if a != o
puts "ERROR: wrong output on test #{tc}"
puts "Input: #{i.inspect}"
puts "Expected: #{o.inspect}"
puts "Actual: #{a.inspect}"
puts
else
puts "ok"
end

end

end
end

支持的 YAML 文件如下所示:

---
- program: summax.exe
tests:
"2\r\n 0 0\r\n": "0\r\n0\r\n"
"4\n 100 1000 -100 -1000": "0\n1001\n"

- program: ./summax
tests:
"2\n 5 6": "11\n6\n"

在 Linux 上,即使运行使用 ABC Pascal 编译的 exe(我想是通过 Wine 和一些 binfmt 魔法),这也能正常工作。在目标平台 Windows 上,相同的代码在打印“Test 1:”行后会卡住,如果我用 ^C 中断它,它可以继续测试 2 或输出更多字符串,然后用 tester.rb:20:in 'puts': Interrupt (或任何其他 put,甚至读取)终止。

使用 sync = true、flush 和 close_write 取消注释所有这些行似乎没有帮助。也将 read 更改为 read_lines.join。甚至用 flush(output); 冲洗另一侧; close(output); 不能解决这个问题。我还应该尝试什么,或者在 Windows 更原生的东西上重写这个程序是否更简单?

最佳答案

在管道的 Ruby 一侧,ProcessPilot gem 解决了 Windows IO.popen 问题。 ABC Pascal 似乎不能很好地处理重定向 IO 流,因此使用 FPC 解决了另一个问题。

使用 Ocra 构建的独立应用程序在未安装 Ruby 的 Windows 计算机上运行良好。我必须以 ocra --gem-minimal tester.rb 启动构建过程来修复 yaml/psych 问题。

关于Ruby IO 无法按预期在 Windows 上工作,随机卡在 put 和 read 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25688651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com