2009-10-08 8 views
2

En Python, vous pouvez faireQuel est l'équivalent de Ruby's de sys.executable de Python?

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

pour obtenir à l'emplacement de l'exécutable. Pouvez-vous faire la même chose en utilisant simplement quelque chose intégré à Ruby? Il peut s'agir d'une variable spéciale, d'une méthode, etc.

Si ce n'est pas le cas, quelle est la manière la plus propre et la plus fiable de déterminer l'emplacement de l'exécutable ruby ​​de manière multiplateforme?

connexes:

Répondre

6

Exécuter ce dans 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]] } 

Il sera une sortie "awesome print" liste de style de toutes les informations de configuration 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 est le chemin de l'interpréteur Ruby en cours d'exécution. Au-dessus dans la liste est BASERUBY => ruby.

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

Contrôle mon travail:

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

Il y a beaucoup plus d'informations que ce donc il vaut la peine de courir le code que j'ajouté ci-dessus pour voir ce qui est disponible.

1

Works dans un script, pas de irb:

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

;-)

+1

Cela ne fonctionne pas si le premier ligne de mon programme est "#!/usr/bin/env ruby" ... –

+0

Je sais, aussi env n'est pas l'interprète. Ce n'est pas censé être très sérieux de toute façon. –

+0

Je l'ai eu du smiley ;-) Y at-il vraiment aucune variable interne qui nous indique le chemin de l'exécutable exécuté? J'ai jeté un rapide coup d'œil à mon livre de cuisine Ruby mais je n'ai rien trouvé. –

2

systèmes basés sur Linux ar e OK avec

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

Il appellera whereis ruby et analyser sa sortie pour la deuxième entrée (premier contient 'whereis:')

La méthode la plus stricte est d'appeler

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

Il obtiendra le nom de l'exécutable pour le processus en cours (il existe $$ variable et la méthode Process.pid pour l'obtenir) à partir de/proc/pid/exe informations de lien symbolique.

+0

Ou juste '\' qui ruby ​​\ '', et une bonne idée avec/proc/pid/exe. –

+0

+1 à/proc/pid/exe. Cependant, je suppose que nous devons élaborer une méthode spéciale de colle multi-plateforme pour répondre à cette question. J'espère que quelqu'un (matz?) Sortirait et dirait tout de suite que "il n'y a rien de tel dans le rubis". – ento

1

Il semble que la réponse soit dans RbConfig :: CONFIG Je pense que RbConfig :: CONFIG ['bindir'] fournit le répertoire dans lequel se trouve l'exécutable, le reste est s (ou devrait être) simple.

RbConfig :: CONFIG [ 'bindir'] + '/ ruby ​​devrait fonctionner, même dans les fenêtres que l'exe peut être ignoré

1

On dirait que le seul vraiment fiable est

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

Cela fonctionne même pour les cas bizarres comme JRuby en cours d'exécution comme un pot, etc.

Voir aussi

OS.ruby_bin 

https://github.com/rdp/os

Questions connexes