该文档为argparse Python模块,而优秀的我敢肯定,是太多了我的小初学者右脑把握现在.我不需要在命令行上进行数学运算,也不需要在屏幕上使用格式化线条或更改选项字符.我想要做的就是"如果arg是A,那么,如果B这样做,如果以上都不显示帮助并退出".
Die*_*rro 352
这是我用它做的方式argparse(有多个args):
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())
Run Code Online (Sandbox Code Playgroud)
args 将是一个包含参数的字典:
if args['foo'] == 'Hello':
# code here
if args['bar'] == 'World':
# code here
Run Code Online (Sandbox Code Playgroud)
在您的情况下,只需添加一个参数.
mig*_*ile 245
我对原始问题的理解是双重的.首先,就最简单的argparse示例而言,我很惊讶我没有在这里看到它.当然,简单来说,它也是所有开销,但功率很小,但它可能会让你开始.
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("a")
args = parser.parse_args()
if args.a == 'magic.name':
print 'You nailed it!'
Run Code Online (Sandbox Code Playgroud)
但现在需要这种位置论证.如果在调用此程序时将其遗漏,则会收到有关缺少参数的错误.这引出了我原始问题的第二部分.Matt Wilkie似乎想要一个没有命名标签的可选参数( - 选项标签).我的建议是修改上面的代码如下:
...
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
Run Code Online (Sandbox Code Playgroud)
可能有一个更优雅的解决方案,但这是有效的,是极简主义的.
DMH*_*DMH 205
该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()
Run Code Online (Sandbox Code Playgroud)
您从中返回的对象parse_args()是一个'Namespace'对象:一个对象,其成员变量以命令行参数命名.该Namespace对象是如何访问你的论点,并与他们相关联的值:
args = parser.parse_args()
print args.my_foo
print args.bar_value
Run Code Online (Sandbox Code Playgroud)
(注意,argparse在命名变量时,用你的下划线替换你的参数名称中的' - '.)
在许多情况下,您可能希望将参数简单地用作不带任何值的标志.你可以像这样在argparse中添加它们:
parser.add_argument('--foo', action='store_true')
parser.add_argument('--no-foo', action='store_false')
Run Code Online (Sandbox Code Playgroud)
上面将分别创建名为'foo'且值为True的变量,以及值为False的'no_foo':
if (args.foo):
print "foo is true"
if (args.no_foo is False):
print "nofoo is false"
Run Code Online (Sandbox Code Playgroud)
另请注意,添加参数时可以使用"required"选项:
parser.add_argument('-o', '--output', required=True)
Run Code Online (Sandbox Code Playgroud)
这样,如果在命令行中省略此参数argparse将告诉您它已丢失并停止执行您的脚本.
最后,请注意,使用该vars函数可以创建参数的dict结构,如果这样可以让您的生活更轻松.
args = parser.parse_args()
argsdict = vars(args)
print argsdict['my_foo']
print argsdict['bar_value']
Run Code Online (Sandbox Code Playgroud)
如您所见,vars返回一个dict,其中您的参数名称为键,其值为er,值.
您可以执行许多其他选项和操作,但这应涵盖最重要的常见使用方案.
Mar*_*ase 55
Matt询问argparse中的位置参数,我同意Python文档在这方面缺乏.在大约20个奇数页面中没有一个完整的例子显示解析和使用位置参数.
这里没有其他答案显示位置参数的完整示例,所以这是一个完整的例子:
# tested with python 2.7.1
import argparse
parser = argparse.ArgumentParser(description="An argparse example")
parser.add_argument('action', help='The action to take (e.g. 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'))
Run Code Online (Sandbox Code Playgroud)
让我失望的是,argparse会将命名参数"--foo-bar"转换为"foo_bar",但名为"foo-bar"的位置参数会保留为"foo-bar",这使得它不太明显如何在你的程序中使用它.
注意我示例末尾附近的两行 - 这些行都不能用于获取foo-bar位置参数的值.第一个显然是错误的(它是一个算术表达式args.foo减去bar),但第二个也不起作用:
AttributeError: 'Namespace' object has no attribute 'foo_bar'
Run Code Online (Sandbox Code Playgroud)
如果要使用该foo-bar属性,则必须使用getattr,如我的示例的最后一行所示.令人抓狂的是,如果您尝试使用dest=foo_bar将属性名称更改为更容易访问的内容,则会收到一条非常奇怪的错误消息:
ValueError: dest supplied twice for positional argument
Run Code Online (Sandbox Code Playgroud)
以下是上述示例的运行方式:
$ 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 (e.g. 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
Run Code Online (Sandbox Code Playgroud)
She*_*ohn 17
另一个摘要介绍,受此帖的启发.
import argparse
# define functions, classes, etc.
# executes when your script is called from the command-line
if __name__ == "__main__":
parser = argparse.ArgumentParser()
#
# define each option with: parser.add_argument
#
args = parser.parse_args() # automatically looks at sys.argv
#
# access results with: args.argumentName
#
Run Code Online (Sandbox Code Playgroud)
参数定义为以下组合:
parser.add_argument( 'name', options... ) # positional argument
parser.add_argument( '-x', options... ) # single-char flag
parser.add_argument( '-x', '--long-name', options... ) # flag with long name
Run Code Online (Sandbox Code Playgroud)
常见的选择是:
--help使用时对此arg的描述.float或int(否则str).'-x', '--long-name', dest='longName').--long-name使用args.long_namestore_true, store_false:对于布尔args'--foo', action='store_true' => args.foo == Truestore_const:与选项一起使用const'--foo', action='store_const', const=42 => args.foo == 42count:对于重复选项,如./myscript.py -vv '-v', action='count' => args.v == 2append:对于重复选项,如./myscript.py --foo 1 --foo 2'--foo', action='append' => args.foo == ['1', '2'] ./myscript.py --foo a b => args.foo = ['a', 'b']type=int).cri*_*fan 13
代码文件:argparseDemo.py
import argparse\n\nargParser = argparse.ArgumentParser()\nargParser.add_argument("-n", "--name", help="your name")\n\nargs = argParser.parse_args()\nprint("args=%s" % args)\n\nprint("args.name=%s" % args.name)\nRun Code Online (Sandbox Code Playgroud)\npython argparseDemo.py -n Crifanpython argparseDemo.py --name Crifanargs=Namespace(name=\'Crifan\')和args.name=CrifanargParser.add_argument("-a", "--age", type=int, help="your current age")\nprint("type(args.age)=%s" % type(args.age))\nRun Code Online (Sandbox Code Playgroud)\npython argparseDemo.py --age 30type(args.age)=<class \'int\'>和args.age=30argParser.add_argument("-a", "--age", required=True, type=int, help="your current age")\nRun Code Online (Sandbox Code Playgroud)\npython argparseDemo.pyargparseDemo.py: error: the following arguments are required: -a/--ageargParser.add_argument("-a", "--age", type=int, default=20, help="your current age. Default is 20")\nRun Code Online (Sandbox Code Playgroud)\npython argparseDemo.pyargs.age=20argParser.add_argument("-f", "--love-fruit", choices=[\'apple\', \'orange\', \'banana\'], help="your love fruits")\nRun Code Online (Sandbox Code Playgroud)\npython argparseDemo.py -f appleargs=Namespace(love_fruit=\'apple\')和args.love_fruit=appleargParser.add_argument("-f", "--love-fruit", nargs=2, help="your love fruits")\nRun Code Online (Sandbox Code Playgroud)\npython argparseDemo.py -f apple orangeargs.love_fruit=[\'apple\', \'orange\']-x代码:
\nimport argparse\n\nargParser = argparse.ArgumentParser()\nargParser.add_argument("-a") # most simple -> got args.a, type is `str`\nargs = argParser.parse_args()\n\nprint("args.a=%s" % args.a)\nRun Code Online (Sandbox Code Playgroud)\n用法=在命令行中运行
\npython argparseDemo.py -a 30\nRun Code Online (Sandbox Code Playgroud)\n./argparseDemo.py -a 30\nargparseDemo.py可执行\nchmod +x argparseDemo.py输出
\nargs.a=30\nRun Code Online (Sandbox Code Playgroud)\n笔记
\nstr\nargParser.add_argument("-a")==argParser.add_argument("-a", type=str)print("type(args.a)=%s" % type(args.a))->type(args.a)=<class \'str\'>args类型为Namespace\nprint("type(args)=%s" % type(args))->type(args)=<class \'argparse.Namespace\'>args值为Namespace(a=\'30\')\nprint("args=%s" % args)->args=Namespace(a=\'30\')args.a--xxxargParser.add_argument("-a", "--age")\nRun Code Online (Sandbox Code Playgroud)\npython argparseDemo.py -a 30\npython argparseDemo.py --age 30args.age\nargs.a和NOT 存在 args.a--xxx-yyyargParser.add_argument("-a", "--current-age")\nRun Code Online (Sandbox Code Playgroud)\nhelpargParser.add_argument("-a", help="your age") # with help\nRun Code Online (Sandbox Code Playgroud)\n--help可以看说明\n\xee\x82\xb0 python argparseDemo.py --help\nusage: argparseDemo.py [-h] [-a A]\n\noptional arguments:\n-h, --help show this help message and exit\n-a A your age\nRun Code Online (Sandbox Code Playgroud)\ntypeargParser.add_argument("-a", type=int) # parsed arg is `int`, not default `str`\nRun Code Online (Sandbox Code Playgroud)\nprint("type(args.a)=%s" % type(args.a))->type(args.a)=<class \'int\'>print("args=%s" % args)->args=Namespace(a=30)defaultargParser.add_argument("-a", type=int, default=20) # if not pass a, a use default value: 20\nRun Code Online (Sandbox Code Playgroud)\npython argparseDemo.pyprint("args.age=%s" % args.age)->args=Namespace(a=20)Ale*_*xey 11
注意Argparse教程在Python的HOWTO文档.它从大多数基本示例开始,如下所示:
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)
Run Code Online (Sandbox Code Playgroud)
并发展到不太基本的.
有一个选项的预定义选项示例,例如:
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)
Run Code Online (Sandbox Code Playgroud)
Pet*_*r L 10
这是我在学习项目中提出的,主要归功于@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()
Run Code Online (Sandbox Code Playgroud)
这可能已经发展并可在线获得:command-line.py
编写此代码的脚本:command-line-demo.sh
您还可以使用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)
Run Code Online (Sandbox Code Playgroud)
没有提供参数 - example.py:
usage: example.py [-h] {A,B}
example.py: error: the following arguments are required: arg
Run Code Online (Sandbox Code Playgroud)
提供了意外的参数 - example.py C:
usage: example.py [-h] {A,B}
example.py: error: argument arg: invalid choice: 'C' (choose from 'A', 'B')
Run Code Online (Sandbox Code Playgroud)
提供了正确的论点 - example.py A:
Argument has value A
Run Code Online (Sandbox Code Playgroud)
完整的帮助菜单(自动生成)- 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
Run Code Online (Sandbox Code Playgroud)
参数名称通常等于参数名称 ( arg)。
arg参数后的元组注解含义如下:
Argument with two possible values)positional) 之一None)None)['A', 'B'])要了解有关使用plac 的更多信息,请查看其出色的文档:
对此很陌生,但将 Python 与 Powershell 结合并使用此模板,受到深入而出色的Python 命令行参数 \xe2\x80\x93 Real Python 的启发
\n您可以在其中做很多事情init_argparse(),我在这里仅介绍最简单的场景。
import argparseif __name__ == "__main__": main()模式从终端执行main()函数中没有参数的参数init_argparse()函数\nargparse.ArgumentParser()parser.add_argument("--<long_param_name>")args通过调用创建对象来解析 argsparser.parse_args()param1用, param2, ...定义一个适当的函数function_proper时将参数指定为args对象的属性\nfunction_proper(param1=args.param1, param2=args.param2)python foobar.py --param1="foo" --param2=="bar"#file: foobar.py\nimport argparse\n\ndef function_proper(param1, param2):\n #CODE...\n\ndef init_argparse() -> argparse.ArgumentParser:\n parser = argparse.ArgumentParser()\n parser.add_argument("--param1")\n parser.add_argument("--param2")\n return parser\n\n\ndef main() -> None:\n parser = init_argparse()\n args = parser.parse_args()\n function_proper(param1=args.param1, param2=args.param2)\n\n\nif __name__ == "__main__":\n main()\nRun Code Online (Sandbox Code Playgroud)\n>>> python .\\foobar.py --param1="foo" --param2=="bar"\nRun Code Online (Sandbox Code Playgroud)\n