gpt4 book ai didi

ruby - Open3.popen3 在 Windows 上返回错误错误 Errno::ENOENT

转载 作者:太空宇宙 更新时间:2023-11-03 16:18:21 27 4
gpt4 key购买 nike

我在 test.rb 中有以下代码:

require 'open3'
cmd = 'C:\Program Files\foo\bar.exe'
Open3.popen3(cmd) do |stdin, stdout, stderr, wait_thr|
puts "stdout: #{stdout.read}"
puts "\n\n"
puts "stderr: #{stderr.read}"
end

bar.exe 是我创建的控制台应用程序,位于 C:\Program Files\foo\。当我运行 bar.exe 时:

  • 它输出“Hello world!”
  • 对于任何参数,例如 bar.exe/blah,它都会输出一条帮助消息。

当我运行 ruby test.rb 时,我得到这个错误:

C:\RailsInstaller/Ruby2.2.0/lib/ruby/2.2.0/open3.rb:193:in 'spawn': No such file or directory - C:\Program Files\foo\bar.exe (Errno::ENOENT)
from C:\RailsInstaller/Ruby2.2.0/lib/ruby/2.2.0/open3.rb:193:in 'popen_run'
from C:\RailsInstaller/Ruby2.2.0/lib/ruby/2.2.0/open3.rb:193:in 'popen3'
from test.rb:3:in '<main>'

如果我更改代码以调用 popen3:

Open3.popen3(cmd, '')

我没有收到 Errno::ENOENT 错误,而是收到帮助消息,但我想要 "Hello World" 输出。

我搜索了一个解决方案,但没有任何效果,包括“Why does Open3.popen3 return wrong error when executable is missing?”的答案。

为什么会出现此错误以及如何解决?

最佳答案

思考一下:

cmd = "\P\f\b"
cmd.size # => 3
cmd.chars # => ["P", "\f", "\b"]
cmd.chars.map(&:ord) # => [80, 12, 8]

cmd = "\\P\\f\\b"
cmd.size # => 6
cmd.chars # => ["\\", "P", "\\", "f", "\\", "b"]
cmd.chars.map(&:ord) # => [92, 80, 92, 102, 92, 98]

cmd = '\P\f\b'
cmd.size # => 6
cmd.chars # => ["\\", "P", "\\", "f", "\\", "b"]
cmd.chars.map(&:ord) # => [92, 80, 92, 102, 92, 98]

与第一个示例一样,您使用带单反斜杠的双引号字符串作为路径/目录分隔符。单个反斜杠 \f\b 是双引号字符串中的转义字符,无法识别,因为它们是使用 \ f\ b.

你有两种方法来处理这个问题,要么像第二个例子那样转义反斜杠,要么像第三个例子那样使用单引号字符串。使用第二种方式被认为是困惑的,所以使用最后一种方式以获得可读性和更容易维护。您将获得相同的字符,但视觉噪音更少。这适用于大多数语言中的字符串使用。

要知道的第二件事是 Ruby 不需要反斜杠作为路径分隔符。 IO documentation说:

Ruby will convert pathnames between different operating system conventions if possible. For instance, on a Windows system the filename "/gumby/ruby/test.rb" will be opened as "\gumby\ruby\test.rb". When specifying a Windows-style filename in a Ruby string, remember to escape the backslashes:

"c:\\gumby\\ruby\\test.rb"

Our examples here will use the Unix-style forward slashes; File::ALT_SEPARATOR can be used to get the platform-specific separator character.

最后,你应该看看 Ruby 的 ShellShellwords在标准库中。他们是你的 friend 。

关于ruby - Open3.popen3 在 Windows 上返回错误错误 Errno::ENOENT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39024590/

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