简单的想法例子: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命令行的简单方法