如果我期待001或999之类的东西(让我们将期望限制在001 ... 999范围内),并且很少有其他参数通过,并且想要忽略任何意外,那么处理命令行参数将是一个简单的表达式?
我理解,例如,我需要找出参数之间是否传递"debug",它将是这样的:
if 'debug' in argv[1:]: print 'Will be running in debug mode.'
如何确定009或575是否通过?
所有这些都是预期的电话:
python script.py python script.py 011 python script.py 256 debug python script.py 391 xls python script.py 999 debug pdf
在这一点上,我不关心这样的电话:
python script.py 001 002 245 568 python script.py some unexpected argument python script.py 0001 python script.py 02
......第一个 - 因为有多个"数字"参数; 第二 - 因为...好,意外的论点; 第三和第四 - 因为非3位数的参数.
正如其他人所回答的那样,optparse是最好的选择,但如果您只是想要快速代码,请尝试以下方法:
import sys, re first_re = re.compile(r'^\d{3}$') if len(sys.argv) > 1: if first_re.match(sys.argv[1]): print "Primary argument is : ", sys.argv[1] else: raise ValueError("First argument should be ...") args = sys.argv[2:] else: args = () # ... anywhere in code ... if 'debug' in args: print 'debug flag' if 'xls' in args: print 'xls flag'
编辑:这是一个optparse示例,因为有很多人在没有真正解释原因的情况下回答optparse,或解释为了使其工作而必须改变的内容.
使用optparse的主要原因是它为您以后的扩展提供了更大的灵活性,并为您提供了更多的命令行灵活性.换句话说,您的选项可以按任何顺序显示,并且会自动生成使用消息.但是,要使其与optparse一起使用,您需要更改规范,将" - "或" - "放在可选参数的前面,并且您需要允许所有参数按任何顺序排列.
所以这是一个使用optparse的例子:
import sys, re, optparse first_re = re.compile(r'^\d{3}$') parser = optparse.OptionParser() parser.set_defaults(debug=False,xls=False) parser.add_option('--debug', action='store_true', dest='debug') parser.add_option('--xls', action='store_true', dest='xls') (options, args) = parser.parse_args() if len(args) == 1: if first_re.match(args[0]): print "Primary argument is : ", args[0] else: raise ValueError("First argument should be ...") elif len(args) > 1: raise ValueError("Too many command line arguments") if options.debug: print 'debug flag' if options.xls: print 'xls flag'
这里与optparse和您的规范的区别在于,现在您可以使用以下命令行:
python script.py --debug --xls 001
并且您可以通过调用parser.add_option()轻松添加新选项
看看optparse模块.自己处理sys.argv对于非常简单的事情来说很好,但它很快就会失控.
请注意,如果您可以稍微更改参数格式,您可能会发现optparse更容易使用; 例如,替代debug
用--debug
和xls
用--xls
或--output=xls
.