2010年5月23日 星期日

如何增進工程師效率 - command line option

Scripting language 大多有內建的 command line option 的支援。相對之下,C 的內建只有 argc 和 argv。善用 command line option 可以讓 script language (1) 根據不同的 option 改變程式的行為而不用重改程式;(2) 可以傳參數進程式而不是在程式中設死。

Ex1: convert_netlist.rb -s => 產生 spice netlist;  convert_netlist -l => 產生 lvs netlist

Ex2: cap_filter -c 1.5 -o output.cdl => 移除 cap 值小於 1.5fF, 並存於 output.cdl

 

本文比較 ruby 和 python 的 command line option 的用法及比較不同

 

Ruby

Ruby 有好幾個不同的 command line option parser.  我們主要 focus 在內建的 optparse, 這是在標準的 library 內,不需要再用 gem.

#!/usr/bin/env ruby
require 'optparse'

# This hash will hold all of the options
# parsed from the command-line by
# OptionParser.
options = {}

optparse = OptionParser.new do |opts|
  # Set a banner, displayed at the top
  # of the help screen.
  opts.banner = "Usage: #{$0} [options] <in.cdl> <out.cdl>"
  # Define the options, and what they do
  options[:force] = false
  opts.on( '-f', '--force', 'Force to overwrite output file' ) do
    options[:force] = true
  end
  options[:capval] = 0.0
  opts.on( '-c', '--cap value', Float, 'CPP -> MOMCAPS' ) do|f|
    options[:capval] = f
  end
  options[:bracket] = false
  opts.on( '-b', '--bracket', 'Bracket <> -> []' ) do
    options[:bracket] = true
  end
  options[:dummy] = false
  opts.on( '-d', '--dummy', 'Dummy cap and resistor removal' ) do
    options[:dummy] = true
  end
  options[:logfile] = nil
  opts.on( '-l', '--logfile FILE', 'Write log to FILE' ) do|file|
    options[:logfile] = file
  end
  # This displays the help screen, all programs are
  # assumed to have this option.
  opts.on( '-h', '--help', 'Display this screen' ) do
    puts opts
    exit
  end
end

# Parse the command-line. The 'parse' method simply parses
# ARGV, while the 'parse!' method parses ARGV and removes
# any options found there, as well as any parameters for
# the options. What's left is the list of files to resize.

begin optparse.parse!(ARGV)

 

rescue OptionParser::InvalidOption => e

puts e

puts optparse

exit

end

puts "Force to overwrite output file" if options[:force]
puts "CPP -> MOMCAPS #{options[:capval]}" if options[:capval]
puts "Bracket <> -> []" if options[:bracket]
puts "Dummy cap & resistor removal" if options[:dummy]
puts "Logging to file #{options[:logfile]}" if options[:logfile]

 

說明如下:

* require 'optparse'   使用內建的 option parser

* 需要用到兩個 class: options (Hash class) 和 optparse (OptonParser class)

optparse 負責 command line 訊息的顯示和處理。以及 handle 例外的情況。

options = {"force"=>true, "calval"=>1.5, "bracket"=>false,"dummy"=>true,"logfile"=>"kkk"}

這是我們熟悉的 Hash class, 儲存 option parser 處理過後的結果。

* ARGV 則是儲存移除 option 後留下的 command line 參數。

 

Python 

from optparse import OptionParser

parser = OptionParser()

parser.add_option("-f", "--file", dest="filename",
help="write report to FILE", metavar="FILE")

parser.add_option("-q", "--quiet",
action="store_false", dest="verbose", default=True,
help="don't print status messages to stdout")

parser.add_option("-s", "--sample", dest="sample", default=900,
type="int", help="measurement samples, 3x")

parser.add_option("-t", "--turn", dest="turn", default=5,
type="int", help="high Q transition turn sample")

parser.add_option("-r", "--rho", dest="rho", default=0.99,
type="float", help="Adaptive rate rho between 0.95 to 1.0")

(options, args) = parser.parse_args()

print options.filename
print options.turn
print options.sample
print options.rho
print options.q_dot

print options
print args

說明如下:

* from optparse import OptionParse

 

* 主要的處理是在 parser (OptionParser class) 完成。如 Ruby 同樣包含 command line 訊息的顯示和處理。以及 handle 例外的情況。

 

* 最後的結果有二個。 options 是處理過後的結果。options.filenames 和 options.verbose (定義在 dest 後).

 

* args 則是儲存移除 option 後留下的 command line 參數。



追蹤者