需要简单的argparse示例:1个参数,3个结果
对于argparse这个Python模块的文档,我相信它写得很好,但对我这个刚入门的小白来说实在太复杂了。我不需要在命令行上做数学运算,也不想调整屏幕上的格式或更改选项字符。我只想做一件事:"如果参数是A,就执行这个;如果是B,就执行那个;如果都不是,就显示帮助信息并退出"。
17 个回答
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
返回一个字典,参数名作为键,对应的值作为值。
还有很多其他选项和功能可以使用,但这些应该涵盖了最基本和常见的使用场景。
这是我用 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
在你的情况下,只需要添加一个参数就可以了。
我对原问题的理解有两个方面。首先,关于最简单的 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
可能还有更优雅的解决方案,但这个方法有效且简单。