Что эквивалентно Ruby для Python sys.executable? - PullRequest
2 голосов
/ 08 октября 2009

В Python вы можете сделать

>>> import sys
>>> sys.executable
'/usr/bin/python'

чтобы получить в месте расположения исполняемого файла. Можете ли вы сделать то же самое, просто используя что-то встроенное в Ruby? Это может быть специальная переменная, метод и т. Д.

Если нет, каков самый чистый и надежный способ определения местоположения исполняемого файла ruby ​​кроссплатформенным способом?

Относящиеся

Ответы [ 5 ]

6 голосов
/ 02 декабря 2010

Запустите это в IRB:

require 'rbconfig'

key_length = RbConfig::CONFIG.keys.max{ |a,b| a.length <=> b.length }.length
RbConfig::CONFIG.keys.sort_by{ |a| a.downcase }.each { |k| puts "%*s => %s" % [key_length, k, RbConfig::CONFIG[k]] }

Будет выведен список стилей "удивительная печать" со всей информацией о конфигурации Ruby.

   ALLOCA => 
       AR => ar
     arch => x86_64-darwin10.5.0
ARCH_FLAG => 
  archdir => /Users/greg/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/x86_64-darwin10.5.0
 ARCHFILE => 
       AS => as
  ASFLAGS => 
 BASERUBY => ruby
   bindir => /Users/greg/.rvm/rubies/ruby-1.9.2-p0/bin

bindir - это путь к текущему интерпретатору Ruby. Над ним в списке стоит BASERUBY => ruby.

RbConfig::CONFIG.values_at('bindir', 'BASERUBY').join('/')
=> "/Users/greg/.rvm/rubies/ruby-1.9.2-p0/bin/ruby"

Проверка моей работы:

greg-mbp-wireless:~ greg$ which ruby
/Users/greg/.rvm/rubies/ruby-1.9.2-p0/bin/ruby

Информации намного больше, чем эта, поэтому стоит запустить код, который я добавил выше, чтобы посмотреть, что доступно.

2 голосов
/ 08 октября 2009

Linux-системы в порядке с

`whereis ruby`.split(" ")[1]

Он вызовет whereis ruby и проанализирует свой вывод для второй записи (первая содержит whereis:)

Более строгим методом является вызов

puts `ls -al /proc/#{$$}/exe`.split(" ")[-1]

Он получит имя исполняемого файла для текущего процесса (для этого есть переменная $$ и метод Process.pid) из информации / proc / pid / exe символьная ссылка.

1 голос
/ 26 июля 2012

Похоже, что единственный действительно надежный способ -

 system("#{Gem.ruby} another_file.rb")

Это работает даже в нечетных случаях, таких как запуск jruby в качестве баночки и т. Д.

Также см.

 OS.ruby_bin

https://github.com/rdp/os

1 голос
/ 02 декабря 2010

Похоже, ответ в RbConfig :: CONFIG Я думаю, что RbConfig :: CONFIG ['bindir'] предоставляет каталог, в котором находится исполняемый файл, остальное (или должно быть) прямо вперед.

RbConfig :: CONFIG ['bindir'] + '/ ruby' должно работать, даже в окнах, поскольку exe может быть пропущен

1 голос
/ 08 октября 2009

Работает в скрипте, а не из irb:

puts open($PROGRAM_NAME).readline.gsub /#! *([^ ]+).*/, '\1'

; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...