如何获取在Windows上运行当前脚本的ruby.exe的路径?

时间:2013-08-01 21:56:41

标签: ruby windows

其他脚本中有变量,如:

python:print(sys.executable)

php:echo PHP_BINARY."\n";

红宝石中有类似的东西吗?

(ruby v.2.0)

3 个答案:

答案 0 :(得分:0)

您可以查看rubinius configure(build_ruby

所以,目前看起来如下:

require 'rbconfig'

def build_ruby
  unless @build_ruby
    bin = RbConfig::CONFIG["RUBY_INSTALL_NAME"] || RbConfig::CONFIG["ruby_install_name"]
    bin += (RbConfig::CONFIG['EXEEXT'] || RbConfig::CONFIG['exeext'] || '')
    @build_ruby = File.join(RbConfig::CONFIG['bindir'], bin)
  end
  @build_ruby
end

我也尝试了以下内容:

require 'rbconfig'

File.join( RbConfig::CONFIG['bindir'],
           RbConfig::CONFIG['RUBY_INSTALL_NAME'] + RbConfig::CONFIG['EXEEXT']
         )

它对我有用。

答案 1 :(得分:0)

尝试%x(where ruby)你的路径中必须有ruby.exe才能正常工作,因此Windows知道你所说的'红宝石'。

答案 2 :(得分:0)

以下答案都不可靠。它们使用静态信息,但ruby脚本可能由安装在不同于默认路径的ruby实例或不在PATH环境变量中的路径执行。

您需要做的是使用WIN32 api。特别是,需要调用GetModuleHandleGetModuleFileName函数。第一个获取实际过程的句柄,另一个返回其路径。

灵感的例子:

require 'ffi'

module Helpers
  extend FFI::Library

  ffi_lib :kernel32

  typedef :uintptr_t, :hmodule
  typedef :ulong, :dword

  attach_function :GetModuleHandle, :GetModuleHandleA, [:string], :hmodule
  attach_function :GetModuleFileName, :GetModuleFileNameA, [:hmodule, :pointer, :dword], :dword

  def self.actualRubyExecutable
    processHandle = GetModuleHandle nil

    # There is a potential issue if the ruby executable path is
    # longer than 999 chars.
    rubyPath = FFI::MemoryPointer.new 1000
    rubyPathSize = GetModuleFileName processHandle, rubyPath, 999

    rubyPath.read_string rubyPathSize
  end
end

puts Helpers.actualRubyExecutable

在Linux上,可以从/proc目录中读取此信息。