如果错误地使用了参数,Python命令行参数不会引发错误

时间:2016-07-20 14:17:04

标签: python command-line arguments optional-parameters

我有以下Python代码,它有1个命令行可选参数(c),它有一个参数和2个没有参数的选项(ab):

import sys, getopt

def main(argv):
   inputfile = ''
   outputfile = ''
   try:
      opts, args = getopt.getopt(argv,"abc:",["csvfile="])
   except getopt.GetoptError:
      print 'Error in usage - a does not require an argument'
      sys.exit(2)
   for opt, arg in opts:
      print "Raw input is: {}" .format(opt)
      if opt in ("-c", "--csvfile"):
         outputfile = arg
         print 'Output file is {}' .format(outputfile)
      elif opt == '-a':
         print 'Alpha'
      elif opt == '-b':
         print 'Beta'
      print 'User choice is {}' .format(opt.lstrip('-'))

if __name__ == "__main__":
   main(sys.argv[1:])

当我输入python readwritestore.py -a时,我得到:

Raw input is: -a
Alpha
User choice is a

如果命令行参数为-a,这就是我所希望的。但是,如果我输入python readwritestore.py -a csvfile_name,那么我会得到:

Raw input is: -a
Alpha
User choice is a

这不是我的意图。在此函数中,c是获取参数的唯一选项。如果我带参数输入a, 代码应该给出我设置的错误消息

Error in usage - a does not require an argument

ab不会发生这种情况。它允许输入参数而不会引发错误。

如果使用参数输入不需要参数的选项,那么我希望它引发错误。 python readwritestore.py -a text 并且python readwritestore.py -b text应该引发错误Error in usage - a does not require an argument

有没有办法指定这个? getopt()是否有正确的方法?

其他信息:

我只希望python readwritestore.py -c text使用参数。对于其他两个选项ab,代码应该引发错误。

1 个答案:

答案 0 :(得分:1)

检查sys.argv的大小(调用脚本时提供的参数列表)可以帮助您检查:

import sys
import getopt


def main(argv):
    inputfile = ''
    outputfile = ''
    opts, args = getopt.getopt(argv, "abc:", ["csvfile="])
    for opt, arg in opts:
        print "Raw input is:", opt
        if opt in ("-c", "--csvfile"):
            outputfile = arg
            print 'Output file is ', outputfile
        elif opt == '-a':
            if len(sys.argv)=2:
                print 'Alpha'
            else:
                print "incorect number of argument"
        elif opt == '-b':
            if len(sys.argv)=2:
                print 'Beta'
            else:
                print "incorect number of argument"
        print 'User choice is ', opt

if __name__ == "__main__":
    main(sys.argv[1:])

我知道这不是你问的问题(argparse)但是你可以用argparse来做这件事:

from argparse import *

def main():
    parser = ArgumentParser()
    parser.add_argument('-c', '--csvfile', help='do smth with cvsfile')
    parser.add_argument(
        '-a', '--Alpha', help='Alpha', action='store_true')
    parser.add_argument(
        '-b', '--Beta', help='beta smth', action='store_true')
    if args.csvfile:
        print 'Output file is {}' .format(args.csvfile)
    if args.Alpha:
        print 'Alpha'
    if args.Beta:
        print 'Beta'

if __name__ == "__main__":
    main()

它会引发错误,提供的参数很多。 (python readwritestore.py -h也会像unix中的man一样显示帮助)