Python argparse示例?

12

我正在尝试学习argparse,以便在我的程序中使用它,语法应该像这样:

-a --aLong <String> <String>
-b --bLong <String> <String> <Integer>
-c --cLong <String>
-h --help

我有这段代码:

#!/usr/bin/env python
#coding: utf-8

import argparse

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Lorem Ipsum')
    parser.add_argument('-a','--aLong', help='Lorem Ipsum', required=False)
    parser.add_argument('-b','--bLong', help='Lorem Ipsum', required=False)
    parser.add_argument('-c','--cLong', help='Lorem Ipsum', required=False)
    parser.add_argument('-h','--help', help='Lorem Ipsum', required=False)
    parser.parse_args()

问题是,我在官方文档中阅读,看了YouTube视频等,但我不知道如何确定“主要参数”的“子参数”的数量?

例如:myApp.py -b Foobar 9000,我如何设置-b必须有两个“子参数”,以及如何获取值Foobar9000

还有一个疑问,我知道我可以将参数设置为required或不是,但我希望使我的程序仅在传递至少一个参数时才执行任何四个提到的参数之一。

也许这是一个愚蠢的问题,但抱歉,我无法理解它,希望这里有“教师力量”的人能够解释一下。


你可以使用参数组来实现你所提到的功能 - http://docs.python.org/dev/library/argparse.html#argument-groups。 - Danstahr
1
"argument-groups" 不会有所帮助。它们影响“帮助”显示,但不影响解析。像 FMc 一样,在解析后进行测试是确保给出其中3个参数的方法。互斥组可用于防止使用组中超过1个,但OP想要“至少一个”。 - hpaulj
2个回答

9
import argparse

# Use nargs to specify how many arguments an option should take.
ap = argparse.ArgumentParser()
ap.add_argument('-a', nargs=2)
ap.add_argument('-b', nargs=3)
ap.add_argument('-c', nargs=1)

# An illustration of how access the arguments.
opts = ap.parse_args('-a A1 A2 -b B1 B2 B3 -c C1'.split())

print(opts)
print(opts.a)
print(opts.b)
print(opts.c)

# To require that at least one option be supplied (-a, -b, or -c)
# you have to write your own logic. For example:
opts = ap.parse_args([])
if not any([opts.a, opts.b, opts.c]):
    ap.print_usage()
    quit()

print("This won't run.")

4
OP打了 python-3.x 的标签,但这个答案是Python 2的。 - Gareth Rees
1
还不够完美:在Python 3中,filter返回一个迭代器而不是列表。你应该写成if not any([opts.a, opts.b, opts.c]): - Gareth Rees
谢谢,我现在懂了。只是有一个小疑问:我尝试使用类似'-a','--aLong'这样的内容,但是如果我这样做,当我调用opts.a时,它会给出一个错误-AttributeError: 'Namespace' object has no attribute 'a',所以我必须调用opts.aLong,为什么? - JChris
添加一个 dest 参数 parser.add_argument('-a', '--aLong', dest='a' ...) - wwii
OP还希望-b接受2个字符串和1个整数。argparse无法直接处理这种情况。自定义操作可以实现,但这是一个高级话题。 - hpaulj
不错的,实用的例子。 - voices

2
这的关键是定义一个必需的、互斥的组。
import argparse

# Use nargs to specify how many arguments an option should take.
ap = argparse.ArgumentParser()
group = ap.add_mutually_exclusive_group(required=True)
group.add_argument('-a', nargs=2)
group.add_argument('-b', nargs=3)
group.add_argument('-c', nargs=1)


# Grab the opts from argv
opts = ap.parse_args()

# This line will not be reached if none of a/b/c are specified.
# Usage/help will be printed instead.

print(opts)
print(opts.a)
print(opts.b)
print(opts.c)

2
你所需的组意味着需要确切地一个选项。原帖作者想要“至少一个”。 - hpaulj

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