如果我期待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位数的参数。
答案 0 :(得分:31)
正如其他人所回答的那样,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()
轻松添加新选项答案 1 :(得分:15)
查看optparse模块。自己处理sys.argv对于非常简单的事情来说很好,但它很快就会失控。
请注意,如果您可以稍微更改参数格式,您可能会发现optparse更容易使用;例如将debug
替换为--debug
,将xls
替换为--xls
或--output=xls
。
答案 2 :(得分:2)
答案 3 :(得分:2)
如果要实现实际的命令行开关,请查看getopt。它的使用也非常简单。
答案 4 :(得分:0)
Van Gale在使用正则表达式反对参数时基本上是正确的。但是,使用optparse并不是绝对必要的,因为optparse将sys.argv拆分为选项和参数,基于“ - ”或“ - ”是否在前面。一些示例代码只需要参数:
import sys
import optparse
claParser = optparse.OptionParser()
claParser.add_option(
(opts, args) = claParser.parse_args()
if (len(args) >= 1):
print "Arguments:"
for arg in args:
print " " + arg
else:
print "No arguments"
sys.exit(0)
是的,args数组的解析方式与sys.argv的解析方式大致相同,但是添加了根据需要轻松添加选项的功能。有关optparse的更多信息,请查看relevant Python doc。