29

如果我期望像 001 或 999 之类的东西(让我们这次将期望限制在 001...999 范围内),并且通过的其他参数很少,并且想忽略任何意外,那么处理命令行参数的简单表达式是什么? ?

我知道,例如,如果我需要确定是否在参数之间传递了“调试”,它会是这样的:

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 位参数。

4

5 回答 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 和您的规范的区别在于,现在您可以使用如下命令行:

python script.py --debug --xls 001

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

于 2009-02-20T01:02:40.420 回答
16

看看optparse模块。自己处理 sys.argv 对于非常简单的东西来说很好,但它很快就会失控。

请注意,如果您可以稍微更改参数格式,您可能会发现 optparse 更易于使用;例如debug--debugandxls替换--xlsor --output=xls

于 2009-02-20T00:51:36.873 回答
2

optparse是解析命令行的最佳朋友。还要查看argparse;不过,它不在标准库中。

于 2009-02-20T00:54:06.087 回答
2

如果您想实现实际的命令行开关,请看一下getopt。使用起来也非常简单。

于 2009-02-20T01:55:06.970 回答
0

Van Gale 在对论点使用正则表达式时在很大程度上是正确的。但是,在使用 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 文档

于 2009-02-20T05:02:44.397 回答