如何在Python中处理命令行参数?

31

如果我期望的命令行参数类似于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

...第一个原因是有多个“numeric”参数;第二个原因是由于意外的参数;第三和第四个原因是由于非3位数字的参数。


看看这个:https://dev59.com/zILba4cB1Zd3GeqPmP7q#25605529 - geekyjazzy
5个回答

32

正如其他人所回答的那样,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和您的规范(spec)不同的地方在于,现在你可以有类似以下的命令行参数:
python script.py --debug --xls 001

你可以通过调用parser.add_option()轻松添加新选项。


4
请注意:optparse自Python 2.7开始已被“弃用:optparse模块已被弃用,将不再进一步开发;开发将继续使用argparse模块。”请参阅:http://docs.python.org/2/library/optparse.html - kkurian

16

请看一下optparse模块。对于真正简单的东西,自己处理sys.argv是可以的,但很快就会失控。

注意,如果您可以稍微改变参数格式,例如使用--debug代替debug以及--xls--output=xls来代替xls,则可能会发现使用optparse更容易。


当原始问题只是使用参数而不是选项时,我不确定这是否值得。 - Nikhil
6
请注意,optparse已被argparse取代。 - Skip Huffman

2

optparse是用于解析命令行的最佳工具。同时,也可以参考argparse;虽然它不在标准库中。


3
请注意,argparse现在已成为Python 2.7的标准库,甚至似乎已被移植到2.6.8版本。根据optparse文档的说明,optparse现在已经被弃用。 - Trebor Rude

2

如果您想实现实际的命令行选项,请看一下getopt。它非常简单易用。


我不会说getopt非常简单 - 当然,它比手动解析要好,但它只是一些C代码的移植,没有真正利用Python的优势。我几乎总是建议使用optparse而不是getopt。 - David Z

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的信息,请查看Python相关文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接