|
|
||
ターミナルから実行するスクリプトを作るときに、ディレクトリをロードパスに追加したり、コマンドラインのオプションを扱うことがあります。
これを、RubyとPythonの場合で、それぞれ比較してみました。
#!/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
#!/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()
オプションの扱いは両者の流儀の違いが出ていておもしろいですね。
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なやり方がありそうです。
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
おかげでコードがキレイになりました。バリケンさん、ありがとうございます!