Python脚本中的命令行参数顺序

时间:2011-01-13 19:58:16

标签: python

假设我有以下脚本。

此脚本查找/ home下的最大文件,并使用10个最大的文件通过电子邮件发送输出。

./myscript.py -d /home -e joe@email.com -p 10

假设我不希望它给我发电子邮件,我删除“-e joe@email.com”脚本失败,因为它期望“-e”存在。我通过sys.arg[0] ... sys.arg[1]等分配变量。

3 个答案:

答案 0 :(得分:4)

使用argparseoptparse模块来解析您的参数,而不是自己解析它们。它允许使用可选参数,您可以指定默认值。

以下是使用optparse的简短示例:

import optparse

parser = optparse.OptionParser()

parser.add_option("-d", "--directory", metavar="DIR",
    help="Directory to scan for big files")
parser.add_option("-e", "--email", metavar='EMAIL', 
    help='email to send the list to')

opts, args = parser.parse_args()

print 'scanning', opts.directory

if opts.email is None:
    print 'not sending the email'

答案 1 :(得分:3)

不是通过sys.arg直接为变量分配参数,为什么不尝试使用getoptargparse模块?这样做更容易,也更灵活。以下是使用argparse的示例(来自Python 2.7的文档):

import argparse

parser = argparse.ArgumentParser(description='Sum or find the max of some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
                   help='just an integer')
parser.add_argument('--sum', dest='accumulate', action='store_const',
                   const=sum, default=max,
                   help='sum command line arguments [default action is to find the maximum]')

args = parser.parse_args() # Simple enough, right?
print args.accumulate(args.integers)

您可以使用(我们称之为args.py):

# ./args.py 1 2 3 4
4

# ./args.py 1 2 3 4 --sum
10

我甚至改变了整数参数和--sum的顺序,但它似乎并不介意!

或者,使用getopt

import getopt, sys

def main():
    try:
        opts, args = getopt.getopt(sys.argv[1:], "hm:v", ["help", "message="])
    except getopt.GetoptError, err:
        print str(err) # will print an error about option not recognized..
        # maybe you should print something informative about correct usage here.
        sys.exit(1)
    # Default option values
    message = None
    verbose = False
    # Process cmd line options
    for o, a in opts:
        if o == "-v":
            verbose = True
        elif o in ("-h", "--help"):
            usage()
            sys.exit(2)
        elif o in ("-m", "--message"):
            message = a
        else:
            assert False, "unhandled option!"
    '''
    Do whatever you wish..
    '''

if __name__ == "__main__":
    main()

答案 2 :(得分:1)

对于Python-2.4,我认为optparse是解析命令行参数的推荐方法。它使用起来非常简单,它绝对比手动解析选项更好,尽管它不像Python-2.7中引入的新argparse模块那样通用。

编辑:

以下是我的某个Python程序中的(略微修改过的)optparse代码段:

options = optparse.OptionParser(description = 'Convert Foo to Bar')

options.add_option('-i', '--input', dest = 'input', action = 'store', default = '-')
options.add_option('-j', '--json', dest = 'json', action = 'store_true', default = False)
options.add_option('-m', '--mongodb', dest = 'mongodb', action = 'store', default = None)
options.add_option('-o', '--output', dest = 'output', action = 'store', default = '-')

(options, argv) = options.parse_args(sys.argv)

if options.json:
    print "output: " + options.output