Python argparse:至少一个参数为必填项

119 投票
13 回答
75187 浏览
提问于 2025-04-16 21:42

我在用 argparse 这个工具写一个 Python 程序,这个程序可以 -process(处理)、-upload(上传)或者同时做这两件事:

parser = argparse.ArgumentParser(description='Log archiver arguments.')
parser.add_argument('-process', action='store_true')
parser.add_argument('-upload',  action='store_true')
args = parser.parse_args()

如果没有至少一个参数,这个程序就没有意义。我该怎么设置 argparse,让它强制要求至少选择一个参数呢?

更新:

根据评论的反馈:用 Python 的方式,怎么让一个程序至少有一个选项可供选择呢?

13 个回答

46

在编程中,有时候我们会遇到一些问题,比如代码运行不正常或者出现错误。这些问题可能是因为我们没有正确理解某些概念或者使用了不合适的方法。

当你在写代码时,可能会需要查找一些资料或者向别人请教。这时候,StackOverflow就是一个很好的地方。这里有很多程序员分享他们的经验和解决方案,你可以在这里找到很多有用的信息。

如果你在StackOverflow上看到一些代码示例,比如

args = vars(parser.parse_args())
if not any(args.values()):
    parser.error('No arguments provided.')
,这通常是用来说明某个问题的解决办法或者展示某种用法的。理解这些代码示例可以帮助你更好地掌握编程技巧。

总之,遇到问题时不要气馁,多看看别人的经验和建议,慢慢你就会变得越来越熟练。

48

我知道这个问题已经很久了,但如果你想要确保用户只能选择一个选项,而不能选择多个(也就是“异或”),可以这样做:

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group(required=True)
group.add_argument('-process', action='store_true')
group.add_argument('-upload',  action='store_true')
args = parser.parse_args()
print(args)
    

输出结果:

>opt.py  
usage: multiplot.py [-h] (-process | -upload)  
multiplot.py: error: one of the arguments -process -upload is required  
    
>opt.py -upload  
Namespace(process=False, upload=True)  
  
>opt.py -process  
Namespace(process=True, upload=False)  
  
>opt.py -upload -process  
usage: multiplot.py [-h] (-process | -upload)  
multiplot.py: error: argument -process: not allowed with argument -upload  
142

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,尤其是当我们还不太熟悉这些技术时。比如,有人可能在使用某个特定的功能时,发现它没有按照预期工作,或者出现了错误信息。这时候,我们可以在网上寻找帮助,比如在StackOverflow这样的网站上提问,看看有没有人遇到过类似的问题,或者有没有解决方案。

在提问的时候,描述问题的细节非常重要。比如,说明你在做什么,遇到了什么错误,使用的是什么工具或版本,这样其他人才能更好地理解你的问题,并给出有效的建议。

总之,编程过程中遇到问题是很正常的,关键是要学会如何有效地寻求帮助和解决问题。

if not (args.process or args.upload):
    parser.error('No action requested, add -process or -upload')

撰写回答