Hatena::Group::Rubyist::infohack RSSフィード

2007-07-24

RubyとPythonによるロードパスの追加とOptionParser 11:13 はてなブックマーク -  RubyとPythonによるロードパスの追加とOptionParser - Hatena::Group::Rubyist::infohack  RubyとPythonによるロードパスの追加とOptionParser - Hatena::Group::Rubyist::infohack のブックマークコメント

ターミナルから実行するスクリプトを作るときに、ディレクトリをロードパスに追加したり、コマンドラインのオプションを扱うことがあります。

これを、RubyとPythonの場合で、それぞれ比較してみました。

Ruby

#!/usr/local/bin/ruby
$:.unshift File.join(File.dirname(__FILE__), "lib")

require 'optparse'

filename = 'None'
verbose = false

parser = OptionParser.new do |parser|
  parser.banner = "#{File.basename($0,".*")}
  Usage: #{File.basename($0,".*")} [options] arg"
  parser.separator "options:"
  parser.on('-f', '--file FILE', String, "read data from FILENAME"){|f| filename = f }
  parser.on('-v', '--verbose', "verbose"){ verbose = true }
  parser.on('-q', '--quiet', "quiet"){ verbose = false }
  parser.on('-h', '--help', "show this message"){
    puts parser
    exit
  }
end

begin
  parser.parse!
rescue OptionParser::ParseError => err
  $stderr.puts err.message
  $stderr.puts parser.help
  exit 1
end

if ARGV.size >= 1
  p filename
  p verbose
  p ARGV
else
  puts parser.help
end

Python

#!/usr/bin/python

import sys, os
script_dir = os.path.dirname(os.path.abspath(__file__))
python_userlib_dir = script_dir + os.sep + 'lib'
if not python_userlib_dir in sys.path:
    sys.path.append(python_userlib_dir)

def main():
    from optparse import OptionParser
    usage = "usage: %prog [options] arg"
    parser = OptionParser(usage)
    parser.add_option("-f", "--file", dest="filename",
                      help="read data from FILENAME")
    parser.add_option("-v", "--verbose",
                      action="store_true", dest="verbose")
    parser.add_option("-q", "--quiet",
                      action="store_false", dest="verbose")
    (options, args) = parser.parse_args()
    if len(args) != 1:
        parser.error("incorrect number of arguments")
    if options.verbose:
        print "reading %s..." % options.filename
    print options.filename
    print options.verbose
    print args

if __name__ == "__main__":
    main()


オプションの扱いは両者の流儀の違いが出ていておもしろいですね。

2007-04-07

HTTP_PROXY環境変数を取得する。 はてなブックマーク -  HTTP_PROXY環境変数を取得する。 - Hatena::Group::Rubyist::infohack  HTTP_PROXY環境変数を取得する。 - Hatena::Group::Rubyist::infohack のブックマークコメント

Rubyだとこんな感じでしょうか。

    unless ENV["HTTP_PROXY"].nil?
      proxy_name = ENV["HTTP_PROXY"].split(/:/)
      addr = proxy_name[1].delete("/")
      port = proxy_name[2]
      agent.set_proxy(addr, port, user = nil, pass = nil)
    end

もっとcoolなやり方がありそうです。

muscovyduckmuscovyduck2007/04/11 16:52次のような感じでどうでしょう?

require 'uri'

if ENV["http_proxy"]
proxy_uri = URI.parse(ENV['http_proxy'])
agent.set_proxy(proxy_uri.host, proxy_uri.port, user = nil, pass = nil)
end

infohackinfohack2007/04/11 17:12なるほど、ここはURIライブラリを使うのがcoolですね。
おかげでコードがキレイになりました。バリケンさん、ありがとうございます!