使用getopt处理命令行选项和参数

4

我正在尝试使用getopt模块编写Python代码以获取命令行选项和参数。以下是我的代码:

import getopt
import sys

def usage ():
    print('Usage')

def main():
    try:
        opts, args = getopt.getopt(sys.argv[1:], 'xy:')
    except getopt.GetoptError as err:
        print(err)
        usage()
        sys.exit()

    for o,a in opts:
        if o in ("-x", "--xxx"):
            print(a)
        elif o in ("-y", "--yyy"):
            print(a)
        else:
            usage()
            sys.exit()

if __name__ == "__main__":
    main()

问题在于我无法读取选项x的参数,但我可以读取y的参数。我该怎么做才能解决这个问题?

3
你应该查看 http://docs.python.org/library/argparse.html#module-argparse,因为它的语法更加友好。 - Charles Beattie
1
http://docs.python.org/library/argparse.html#module-argparse 是正确的选择。 - user2665694
值得注意的是,通常用于允许“可选”参数的 getopt 双冒号 :: 不受支持,对于新手来说可能会“出现”问题,因为默认情况下允许部分匹配。例如 '--help::' 将允许 '--help',但除非你正在寻找 '--help:',否则永远不会被处理。文档中没有提到这一点,这让我有点生气,因为在这种情况下,Perl 比 Python 获得了更好的 getopt “库”模块... 当然,我们有 optparse 和 argparse(所有这些额外的学习只是因为缺少一个冒号/特性,真是让人恼火!) - osirisgothra
2个回答

12

尝试使用getopt.getopt(sys.argv[1:], 'x:y:')

http://docs.python.org/library/getopt.html

  

解析命令行选项和参数列表。args是要解析的参数列表, 不包括运行程序的前缀引用。通常,这意味着sys.argv[1:]。 options是脚本想要识别的选项字母串,需要一个参数的选项后面跟着一个冒号(':'), 即与Unix getopt()使用相同的格式。


0
如果您想读取参数,则选项旁边应该有“:”,有一些选项不需要参数,例如“help”和“verbose”,不需要后面跟随“:”。
import getopt
import sys

def usage ():
    print('Usage')

def main():
    try:
        opts, args = getopt.getopt(sys.argv[1:], 'x:y:h', ['xxx=', 'yyy=', 'help='])
    except getopt.GetoptError as err:
        print(err)
        usage()
        sys.exit()

    for opt,arg in opts:
        if opt in('-h', '--help'):
            usage()
            sys.exit( 2 )
        elif opt in ('-x', '--xxx'):
            print(arg)
        elif opt in ('-y', '--yyy'):
            print(arg)
        else:
            usage()
            sys.exit()

if __name__ == "__main__":
    main()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接