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 參數。