【问题标题】:Python commandline parameter not raising error if argument is wrongly used如果错误使用参数,Python命令行参数不会引发错误
【发布时间】:2016-11-23 20:09:07
【问题描述】:

我有以下 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 textpython readwritestore.py -b text 应该引发错误Error in usage - a does not require an argument

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

其他信息:

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

【问题讨论】:

  • 您可能需要考虑argparse,这是 Python 更直观的模块。
  • 我在管理没有库的脚本的参数时遇到了很多问题。但是有了Argparse,这真的很容易。如果你愿意,我可以使用这个库发布一个 anwser。
  • 本来建议一样的,如果你改变没有问题,给 argparse 一个机会

标签: python command-line arguments optional-parameters


【解决方案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 一样显示帮助)

【讨论】:

  • 这正是我犯的错误!谢谢你抓住它。但是argparse 似乎好多了。我得调查一下。感谢您的建议。
  • 对不起,我只是想问一个后续问题。 argparse 看起来非常好 - 我很难找到初学者级别的教程 - 有没有可以推荐的好教程?
  • @WR 我理解你,你第一次使用它似乎搞砸了。要学习它,我只是从那里复制粘贴示例 Doc,并尝试测试值并尝试了解附加的内容。这是我最喜欢的例子:SO exemple
  • @WR 您需要关注的是:action=nargs=。首先,不要研究 subparser
  • @WR 我今天偶然发现:null-byte.wonderhowto.com/how-to/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-15
  • 2015-04-21
  • 2020-06-26
相关资源
最近更新 更多