it-swarm.cn

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

文档 用于 argparse python模块 ,虽然我很确定,但对于我的小初学者大脑来说,这对我来说太过分了。我不需要在命令行上进行数学运算,也不需要在屏幕上使用格式化线条或更改选项字符。我想做的就是 “如果arg是A,那么,如果B这样做,如果以上都不显示帮助并退出”

480
matt wilkie

我对原始问题的理解是双重的。首先,就最简单的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似乎想要一个没有命名标签的单个 可选 参数( - 选项标签)。我的建议是修改上面的代码如下:

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

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

222
mightypile

这是我用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())

args将是一个包含参数的字典:

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

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

在您的情况下,只需添加一个参数。

328
Diego Navarro

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的变量,以及值为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将告诉您它已丢失并停止执行您的脚本。

最后,请注意,可以使用vars函数创建参数的dict结构,如果这样可以让您的生活更轻松。

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

如您所见,vars返回一个dict,其参数名称为键,其值为er,value。

您可以执行许多其他选项和操作,但这应涵盖最重要的常见使用方案。

194
DMH

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'))

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

注意我示例末尾附近的两行 - 这些行都不能用于获取foo-bar位置参数的值。第一个显然是错误的(它是一个算术表达式args.foo减去bar),但第二个也不起作用:

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 (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
55
Mark E. Haase

另一个摘要介绍,灵感来自 这篇文章

import argparse

# define functions, classes, etc.

# executes when your script is called from the command-line
if __== "__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
    #

参数定义为以下组合:

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

常见的选择是:

  • help :使用--help时此arg的描述。
  • default :如果省略arg,则为默认值。
  • type :如果你期望floatint(否则是str)。
  • dest :为标志指定一个不同的名称(例如'-x', '--long-name', dest='longName')。
    注意:默认使用--long-name访问args.long_name
  • action :对特定论点的特殊处理
    • store_true, store_falsefor boolean args
      '--foo', action='store_true' => args.foo == True
    • store_const与选项const一起使用
      '--foo', action='store_const', const=42 => args.foo == 42
    • count用于重复选项,如./myscript.py -vv
      '-v', action='count' => args.v == 2
    • append用于重复选项,如./myscript.py --foo 1 --foo 2
      '--foo', action='append' => args.foo == ['1', '2']
  • required :如果需要标志,或者位置参数不是。
  • nargs :用于捕获N args的标志
    ./myscript.py --foo a b => args.foo = ['a', 'b']
  • 选项 :限制可能的输入(指定为字符串列表,如果type=int则指定为ints)。
12
Sheljohn

注意 Argparse教程 in Python HOWTOs 。它从大多数基本示例开始,如下所示:

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)

并发展到不太基本的。

有一个示例可以选择预定义的选项,例如:

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)
10
Alexey

这是我在学习项目中提出的,主要归功于@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 __== "__main__":
    main()

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

编写此代码的脚本: command-line-demo.sh

10
Peter L

你也可以使用 placargparse的包装器)。

作为奖励,它会产生简洁的帮助说明 - 见下文。

示例脚本:

#!/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 __== '__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
  • 参数类型 - 'flag','option'或'positional'之一(positional
  • 缩写(None
  • 参数值的类型 - 例如。 float,string(None
  • 受限制的选择集(['A', 'B']

文档:

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

Plac:轻松解析命令行

4
quasoft

添加其他人所说的内容:

我通常喜欢使用'dest'参数来指定变量名,然后使用'globals()。update()'将这些变量放在全局命名空间中。

用法:

$ 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!"
3
Sandy Chapman