Python getopt太多参数

时间:2013-11-25 11:11:15

标签: python getopt

我走到了尽头。我试图将参数传递给Linux来运行某些操作。我想避免用户输入太多的参数。

例如,所需的脚本运行方式如下:

./audit.py -a

我想阻止以下情况:

./audit.py -af

这似乎正在运行为'a'和'f'指定的任何内容。在这种情况下,如果它像'-af'那么我需要它用sys.exit()退出。无论我输入的参数如何,我的len(sys.argv [1:])总是产生1的结果。

import getopts
import sys
def main():
    try:
        opts, args = getopt.getopt(sys.argv[1:], 'v:adfh')
    except getopt.GetoptError as err:
        sys.exit(str(err))
    if len(sys.argv[1:]) != 1:
        sys.exit('Invalid')

    for o,a in opts:
        if o in ('-v', '--volume'):
            print 'Volumes'
        elif len(sys.argv[2:]) != 0:
            sys.exit('Too many arguments')
        elif o in ('-a', '--agent'):
            print 'Full audit of agents only'
        elif o in ('-d', '--device'):
            print 'Full audit of device only'
        elif o in ('-f', '--full'):
            print 'Full audit of device/agents'
        elif o in ('-h', '--help'):
            sys.exit('Help Section')
if __name__ == '__main__':
    main()

4 个答案:

答案 0 :(得分:0)

sys.argv[1:] is ['-af']的值以及如果检查['-af']的长度是1,这就是if len(sys.argv[1:]) != 1:始终为假的原因。相反,如果你想检查第一个参数的长度,你需要使用len(sys.argv[1:][0])或者每个参数长度。

答案 1 :(得分:0)

问题是sys.argv[1:]会产生切片。换句话说,它是一个列表。在你的情况下,它就像['-af']。当然,除非您没有传递任何参数,否则长度将始终为1。也许你打算这样做:

if not all(i < 1 for i in sys.argv[1:]):
    sys.exit('Invalid')

答案 2 :(得分:0)

您正在查看选项群集。 getopt中似乎没有任何工具可以禁用此功能。但是,无论如何,你可能不应该使用这个包。 argparse可能更适合您的需求吗?

答案 3 :(得分:0)

不是一个完整的答案,但你可能很高兴看到我很高兴找到的图书馆。

docopts - 有一个很棒的视频介绍了如何使用

这是一个很棒的工具,您只需在模块文档部分描述您的参数,例如;

'''
Usage:
   myprog -a -v <volumes>...
   myprog -f
   myprog -h | --help
'''
import docopt
args=docopt.docopt(__doc__)

如果以myprog -a -v one two three;

运行,这将产生以下字典
{
  "--help": false, 
  "-a": true, 
  "-f": false, 
  "-h": false, 
  "-v": true, 
  "": [
    "myprog", 
    "one", 
    "two", 
    "three"
  ]
}