简单的想法例子:1个参数,3个结果

argparse python模块的文档虽然非常出色,但对于我的小小的初学者大脑来说,现在太多了。 我不需要在命令行上进行math运算,或者在屏幕上插入格式化线或更改选项字符。 我想要做的就是“如果arg是A,那么做,如果B做到这一点,如果上面没有显示帮助,退出”

我对原始问题的理解是双重的。 首先,就最简单可行的例子而言,我很惊讶我没有在这里看到它。 当然,简单来说,这也是一切开销,没有什么力量,但它可能会让你开始。

 import argparse parser = argparse.ArgumentParser() parser.add_argument("a") args = parser.parse_args() if args.a == 'magic.name': print 'You nailed it!' 

但是这个立场是必须的。 如果你在调用这个程序的时候把它遗漏了,你会得到一个关于缺less参数的错误。 这导致我原来的问题的第二部分。 马特·威尔基似乎想要一个没有命名标签的单个可选参数( – 选项标签)。 我的build议是修改上面的代码如下:

 ... 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 

有可能是一个更优雅的解决scheme,但这是有效的,是极简主义的。

这是我用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文档是相当不错的,但留下了一些可能不明显的有用的细节。 (@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”对象:一个对象,其成员variables以命令行参数命名。 Namespace对象是你如何访问你的参数和与它们相关的值:

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

(请注意, argparse在命名variables时用下划线replace参数名称中的“ – ”。)

在许多情况下,您可能希望仅将参数用作不带任何价值的标志。 你可以像这样在argparse中添加这些:

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

上面将分别创build一个名为“foo”的值为True的variables和一个名为False的“no_foo”:

 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会告诉你它缺less并停止执行你的脚本。

最后,请注意,如果使用vars函数可以使您的参数的字典结构更加容易,那么可以创build一个dict结构。

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

正如你所看到的, vars返回一个字典,其中你的参数名称是键值,它们的值是呃值。

还有很多其他的select和你可以做的事情,但是这应该包括最重要,最常见的使用场景。

Matt在argparse中询问位置参数,我同意Python文档在这方面是缺乏的。 在〜20个奇数页面中没有一个完整的例子,显示了parsing和使用位置参数

这里没有其他答案显示位置参数的完整示例,所以这里是一个完整的例子:

 # tested with python 2.7.1 import argparse parser = argparse.ArgumentParser(description="An argparse example") parser.add_argument('action', help='The action to take (eg install, remove, etc.)') parser.add_argument('foo-bar', help='Hyphens are cumbersome in positional arguments') args = parser.parse_args() if args.action == "install": print("You asked for installation") else: print("You asked for something other than installation") # The following do not work: # print(args.foo-bar) # print(args.foo_bar) # But this works: print(getattr(args, 'foo-bar')) 

抛弃我的是,argparse会将命名参数“–foo-bar”转换为“foo_bar”,但是名为“foo-bar”的位置参数保留为“foo-bar”,使得不太明显在你的程序中使用它。

注意接近我例子末尾的两行 – 这两行都不能获得foo-bar位置参数的值。 第一个显然是错误的(这是一个算术expression式args.foo减号栏),但第二个也不工作:

 AttributeError: 'Namespace' object has no attribute 'foo_bar' 

如果您想使用foo-bar属性,则必须使用getattr ,如我的示例的最后一行所示。 真是疯狂的是,如果你试图用dest=foo_bar把属性名改成更容易访问的东西,你会得到一个非常奇怪的错误信息:

 ValueError: dest supplied twice for positional argument 

上面的例子运行如下:

 $ python test.py usage: test.py [-h] action foo-bar test.py: error: too few arguments $ python test.py -h usage: test.py [-h] action foo-bar An argparse example positional arguments: action The action to take (eg install, remove, etc.) foo-bar Hyphens are cumbersome in positional arguments optional arguments: -h, --help show this help message and exit $ python test.py install foo You asked for installation foo 

请注意Python HOWTO中的Argparse教程 。 它从大多数基本的例子开始,像这样:

 import argparse parser = argparse.ArgumentParser() parser.add_argument("square", type=int, help="display a square of a given number") args = parser.parse_args() print(args.square**2) 

并进展到不那么基本的。

有一个选项的预定义select的例子,如问:

 import argparse parser = argparse.ArgumentParser() parser.add_argument("square", type=int, help="display a square of a given number") parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2], help="increase output verbosity") args = parser.parse_args() answer = args.square**2 if args.verbosity == 2: print("the square of {} equals {}".format(args.square, answer)) elif args.verbosity == 1: print("{}^2 == {}".format(args.square, answer)) else: print(answer) 

以下是我在学习项目中提出的build议,主要归功于@DMH …

演示代码:

 import argparse def main(): parser = argparse.ArgumentParser() parser.add_argument('-f', '--flag', action='store_true', default=False) # can 'store_false' for no-xxx flags parser.add_argument('-r', '--reqd', required=True) parser.add_argument('-o', '--opt', default='fallback') parser.add_argument('arg', nargs='*') # use '+' for 1 or more args (instead of 0 or more) parsed = parser.parse_args() # NOTE: args with '-' have it replaced with '_' print('Result:', vars(parsed)) print('parsed.reqd:', parsed.reqd) if __name__ == "__main__": main() 

这可能已经发展并可以在线获得: command-line.py

脚本给这个代码锻炼: command-line-demo.sh

添加到别人所说的内容:

我通常喜欢使用'dest'参数来指定一个variables名,然后使用'globals()。update()'将这些variables放到全局名称空间中。

用法:

 $ python script.py -i "Hello, World!" 

码:

 ... parser.add_argument('-i', '--input', ..., dest='inputted_variable',...) globals().update(vars(parser.parse_args())) ... print(inputted_variable) # Prints "Hello, World!" 

你也可以使用plac ( argparse的包装)。

作为奖励它会产生整洁的帮助说明 – 见下文。

示例脚本:

 #!/usr/bin/env python3 def main( arg: ('Argument with two possible values', 'positional', None, None, ['A', 'B']) ): """General help for application""" if arg == 'A': print("Argument has value A") elif arg == 'B': print("Argument has value B") if __name__ == '__main__': import plac plac.call(main) 

示例输出:

没有提供参数 – example.py

 usage: example.py [-h] {A,B} example.py: error: the following arguments are required: arg 

提供了意外的参数 – example.py C

 usage: example.py [-h] {A,B} example.py: error: argument arg: invalid choice: 'C' (choose from 'A', 'B') 

提供了正确的参数 – example.py A

 Argument has value A 

完整的帮助菜单(自动生成) – example.py -h

 usage: example.py [-h] {A,B} General help for application positional arguments: {A,B} Argument with two possible values optional arguments: -h, --help show this help message and exit 

简短的解释:

参数的名称通常等于参数名称( arg )。

arg参数之后的元组注释具有以下含义:

  • 说明( Argument with two possible values
  • 参数types – “标志”,“选项”或“位置”( positional )之一
  • 缩写( None
  • 参数值的types – 例如。 浮点,string( None
  • 有限的select( ['A', 'B']

文档:

要了解有关使用plac的更多信息,请查看其出色的文档:

Plac:parsing命令行的简单方法