需要简单的argparse示例:1个参数,3个结果

678 投票
17 回答
456490 浏览
提问于 2025-04-17 02:21

对于argparse这个Python模块的文档,我相信它写得很好,但对我这个刚入门的小白来说实在太复杂了。我不需要在命令行上做数学运算,也不想调整屏幕上的格式或更改选项字符。我只想做一件事:"如果参数是A,就执行这个;如果是B,就执行那个;如果都不是,就显示帮助信息并退出"

17 个回答

244

argparse 的文档写得还不错,但有些有用的细节可能不太明显。(@Diego Navarro 已经提到了一些,但我会稍微扩展一下他的回答。) 基本用法如下:

parser = argparse.ArgumentParser()
parser.add_argument('-f', '--my-foo', default='foobar')
parser.add_argument('-b', '--bar-value', default=3.14)
args = parser.parse_args()

parse_args() 返回的对象是一个 'Namespace' 对象:这个对象的成员变量是根据你的命令行参数命名的。Namespace 对象就是用来访问你的参数和它们对应的值的:

args = parser.parse_args()
print (args.my_foo)
print (args.bar_value)

(注意,argparse 会把你参数名中的 '-' 替换成下划线来命名变量。)

在很多情况下,你可能只想把参数当作标志使用,而不需要给它们赋值。你可以这样在 argparse 中添加这些标志:

parser.add_argument('--foo', action='store_true')
parser.add_argument('--no-foo', action='store_false')

上面的代码会创建名为 'foo' 的变量,值为 True,和名为 'no_foo' 的变量,值为 False:

if (args.foo):
    print ("foo is true")

if (args.no_foo is False):
    print ("nofoo is false")

还要注意,当添加一个参数时,你可以使用 "required" 选项:

parser.add_argument('-o', '--output', required=True)

这样,如果你在命令行中漏掉了这个参数,argparse 会告诉你缺少这个参数,并停止执行你的脚本。

最后,如果你觉得这样更方便,可以使用 vars 函数来创建一个字典结构来存储你的参数。

args = parser.parse_args()
argsdict = vars(args)
print (argsdict['my_foo'])
print (argsdict['bar_value'])

如你所见,vars 返回一个字典,参数名作为键,对应的值作为值。

还有很多其他选项和功能可以使用,但这些应该涵盖了最基本和常见的使用场景。

470

这是我用 argparse 来处理多个参数的方法:

parser = argparse.ArgumentParser(description='Description of your program')
parser.add_argument('-f','--foo', help='Description for foo argument', required=True)
parser.add_argument('-b','--bar', help='Description for bar argument', required=True)
args = vars(parser.parse_args())

args 将会是一个字典,里面包含了所有的参数:

if args['foo'] == 'Hello':
    # code here

if args['bar'] == 'World':
    # code here

在你的情况下,只需要添加一个参数就可以了。

311

我对原问题的理解有两个方面。首先,关于最简单的 argparse 示例,我很惊讶这里居然没有看到。其实,要做到简单到极致,这个例子可能功能不强,但它可以帮助你入门。

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("a")
args = parser.parse_args()

if args.a == 'magic.name':
    print 'You nailed it!'

不过,这个位置参数现在是必须的。如果你在运行这个程序时不提供这个参数,就会出现缺少参数的错误。这让我想到了原问题的第二个部分。Matt Wilkie 似乎想要一个没有命名标签(比如 --option 标签)的单个可选参数。我的建议是把上面的代码修改成这样:

...
parser.add_argument("a", nargs='?', default="check_string_for_empty")
...
if args.a == 'check_string_for_empty':
    print 'I can tell that no argument was given and I can deal with that here.'
elif args.a == 'magic.name':
    print 'You nailed it!'
else:
    print args.a

可能还有更优雅的解决方案,但这个方法有效且简单。

撰写回答