无法在Python中解析命令行参数

时间:2016-01-28 02:38:32

标签: python command-line-arguments

我正在尝试创建一个接受命令行参数的脚本,并根据输入调用相关函数。 以下是我的主要功能:

from lib.updatefeed import gather
#stdlib imports
import argparse



def main():
    print "test"
    parser = argparse.ArgumentParser(formatter_class=argparse.RawTextHelpFormatter)
    parser.add_argument('-ip', type=str, nargs='+', help="Search for a single IP")

    parser.add_argument('-list', type=str, nargs='?', help="Search for a list of IP")
    parser.add_argument('-update', type=str, nargs='?', help='Update the local storage')
    args = parser.parse_args()
    if args.ip:
        if len(args.ip) > 4:
            print "Too many"
            sys.exit(1)
        parse_ip(args.ip)
    if args.list:
        parse_ipList(list)
    if args.update:
        print "updating"
        gather()

if __name__ == '__main__':
    main()

所有其他参数都正常工作,并且正在调用各自的函数。唯一的问题是“更新”参数。 出于某种原因,在传递-update arg时不会调用gather()函数。我还在函数调用之前添加了一个print语句,但也没有打印。

任何人都可以帮我确定根本原因。

以下是我的聚会功能的一部分:

def gather(self):
    if not os.path.exists('New'):
        os.mkdir('New')
    print "Starting feed update process"

1 个答案:

答案 0 :(得分:2)

parser.add_argument('-update', type=str, nargs='?', help='Update the local storage')

将选项-update声明为采用单个可选参数(nargs='?');选项的值可以是参数(如果提供),也可以是default键的值。但是,您没有提供default密钥,默认defaultNone

因此,如果您只提供没有参数的命令行选项-update,那么args.update的值将为None,并且测试:

if args.update:
        print "updating"
        gather()

会失败,所以什么都不会做。

显然,您只关心命令行中是否存在-update,因此不应该接受任何参数。要处理这种情况,请将选项定义为具有操作store_true,并省略typenargs参数:

parser.add_argument('-update', action='store_true', help='Update the local storage')