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

问题描述:

如果我期待001或999之类的任何东西(让我们将期望值限制在001 ... 999这个范围内),并且通过了其他几个参数并且想要忽略,那么这将是一个简单的表达式来处理命令行参数任何意外?如何在Python中处理命令行参数?

我明白,如果比如我需要找出是否“调试”中的参数中传递这将是类似的东西:

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

退房这个 http://stackoverflow.com/questions/25605380/passing-directory-to-python-script-as-command-line-argument/25605529#25605529 – 2014-09-01 13:41:18

正如其他人回答,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()

+4

但注意:optparse自[Python]版本2.7已被弃用:optparse模块已被弃用且不会进一步开发;开发将继续使用argparse模块。“请参阅:http://docs.python.org/2/library/optparse.html – kkurian 2014-02-11 06:38:25

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

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

+0

我不知道这是当OP只是使用参数而不是选项时,它是值得的。 – 2009-02-20 01:18:57

+4

请注意,optparse已被替换为[argparse](http://docs.python.org/library/argparse.html#module-argparse) – 2011-10-17 11:46:40

optparse是解析命令行的最好朋友。也看看argparse;但它不在标准库中。

+2

正如注释[argparse](http://docs.python.org /2.7/library/argparse.html)现在在Python 2.7中是标准的,甚至似乎已经移植到2.6.8。根据[optparse文档](http://docs.python.org/2/library/optparse.html),现在不推荐使用optparse。 – 2013-04-03 15:31:38

如果要实现实际的命令行开关,请给getopt一看。它的使用也非常简单。

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