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

Python commandline parameter not raising error if argument is wrongly used

我有以下python代码,其中有1个命令行可选参数(c有一个参数,2个选项(ab没有参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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时,我得到:

1
2
3
Raw input is: -a
Alpha
User choice is a

如果命令行的论点是-a,这就是我希望看到的。但是,如果我进入python readwritestore.py -a csvfile_name,我会得到:

1
2
3
Raw input is: -a
Alpha
User choice is a

这不是我的本意。在这个函数中,c是唯一需要参数的选项。如果我用一个参数输入a,代码应该给出我设置的错误消息

1
Error in usage - a does not require an argument

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

如果不需要参数的选项与参数一起输入,那么我希望它引发错误。python readwritestore.py -a textpython readwritestore.py -b text则会引起Error in usage - a does not require an argument的误差。

有没有办法具体说明这一点?这样做的正确方式是getopt()吗?

其他信息:

我只想让python readwritestore.py -c text和这个论点一起工作。对于其他2个选项,即ab,代码会引起错误。


检查sys.argv(调用脚本时提供的参数列表)的大小有助于检查:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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中的人一样)