使用ArgumentParser选择两个选项之一

2 投票
2 回答
2491 浏览
提问于 2025-04-18 00:52

我想让用户有两个选项可以选择。

parser = argparse.ArgumentParser(description='This is a test script...')
parser.add_argument("-test", "-t", choices='aaa,bbb,ccc,ddd'])
parser.add_argument("-dev", "-d", choices=['bbb,ddd'])
parser.add_argument("-path", "-p", choices=['Software','Hardware'])

我有一个命令行是这样的(ipy64 driver.py -t alltests -p Software)

但是,args = parser.parse_args() 返回的结果像这样: Namespace(test='aaa', path='Software')

我想修改这个,如果选择了 -t,就执行一段代码;如果选择了 -d,就执行另一段代码。也就是说,想要实现类似这样的功能……

parser.add_argument("-dev", "-d", "-t", choices=['aaa,bbb,ccc,ddd'])

不过这个命名空间里没有 -test 的值。所以基本上,我希望用户能够选择 -t 或 -d 这两个选项中的一个,并且可以带上相应的值。

谢谢。

2 个回答

0

看看这个:

>>> import argparse
>>> parser = argparse.ArgumentParser(description='This is a test script...')
>>> parser.add_argument("--test", "-t", choices=['aaa','bbb','ccc','ddd'])
_StoreAction(option_strings=['--test', '-t'], dest='test', nargs=None, const=None, default=None, type=None, choices=['aaa', 'bbb', 'ccc', 'ddd'], help=None, metavar
>>> parser.add_argument("--dev", "-d", choices=['bbb','ddd'])
_StoreAction(option_strings=['--dev', '-d'], dest='dev', nargs=None, const=None, default=None, type=None, choices=['bbb', 'ddd'], help=None, metavar=None)
>>> parser.add_argument("--path", "-p", choices=['Software','Hardware'])
_StoreAction(option_strings=['--path', '-p'], dest='path', nargs=None, const=None, default=None, type=None, choices=['Software', 'Hardware'], help=None, metavar=Non
>>> args = parser.parse_args()
>>> args
Namespace(dev=None, path=None, test=None)
>>> parser.print_help()
usage:  [-h] [--test {aaa,bbb,ccc,ddd}] [--dev {bbb,ddd}]
        [--path {Software,Hardware}]

This is a test script...

optional arguments:
  -h, --help            show this help message and exit
  --test {aaa,bbb,ccc,ddd}, -t {aaa,bbb,ccc,ddd}
  --dev {bbb,ddd}, -d {bbb,ddd}
  --path {Software,Hardware}, -p {Software,Hardware}
3

把 -t 和 -d 这两个选项设为可选的,这样做行不行?然后只需要检查一下这个变量有没有被设置。

可以用下面的代码把默认值设为没有:

parser.add_argument("-dev", "-d", choices=['bbb,ddd', None], default =None)

然后在后面的代码中检查一下这个值:

if (parser.dev != None):
    ....( do code)...

我还没测试过这段代码,不过检查值的方式就是我让用户可以选择用 argparse 来运行函数的方法。

撰写回答