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

mat*_*kie 511 python argparse

文档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)

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

  • 作为argparse的一个菜鸟,这个答案真的有帮助,因为*我不知道在通过之后在哪里找到选项*.换句话说,我需要了解如何生成`args`字典如上所述. (32认同)
  • 就个人而言,我发现访问参数更清晰,如`args.foo`和`args.bar`而不是字典语法.无论哪种方式都可以,但args实际上不是字典而是`argparse.Namespace`对象. (16认同)
  • @mattwilkie然后你必须定义一个这样的位置参数:`parser.add_argument('install',help ='安装app')`(注意你不能用`required = True`定义一个位置参数) (7认同)
  • 正如我在对另一个答案的评论中所提到的,我想保留argparse的自动帮助格式,但似乎没有一个选项可以有一个未命名的参数(当我看到它时更可能我不理解它),例如,需要做`foo.py --action install`或`foo.py --action remove`而不是简单的`foo.py install` (3认同)
  • 直接从命令行调用程序时使用"简短形式",在脚本中运行程序/命令时使用"长形式".在这种情况下,它使用长形式更易于阅读,因此更容易遵循代码/脚本的逻辑. (3认同)
  • @strongMA`solutioner.parse_args()`是一个命名空间,我的`args`局部变量是一个dict,因为`vars(parser.parse_args())`返回一个dict,它是完全可迭代的. (2认同)

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)

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

  • 经过一段时间的反思,我总结出这个问题实际上最能回答Q问题和我当时的困境.其他优秀的答案已经获得了足够多的代表来证明自己的价值并且能够经受一点竞争.:-) (3认同)

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

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

  • 对于每个运行时选项,同时具有"短形式"(一个短划线)和"长形式"(两个短划线)版本是非常传统的.例如,您将在几乎所有标准Unix/Linux实用程序中看到这一点; 做一个`man cp`或`man ls`,你会发现很多选择都有两种风格(例如`-f, - force`).人们更喜欢这样或那样的原因可能有很多种,但无论如何,在你的程序中提供这两种表格是非常标准的. (13认同)
  • '-f'和'-b'`的重点是什么?为什么你不能省略这个? (2认同)

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)

  • `nargs ='?'`是根据http://stackoverflow.com/questions/4480075/argparse-optional-positional-arguments的"可选位置"的咒语 (5认同)
  • 我认为此错误的更简单解决方法是只调用参数“ foo_bar”而不是“ foo-bar”,然后`print args.foo_bar`起作用。由于它是一个位置参数,因此您在调用脚本时不必指定名称,因此对用户而言无关紧要。 (2认同)

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:--help使用时对此arg的描述.
  • default:如果省略arg,则为默认值.
  • 类型:如果您期望a floatint(否则str).
  • dest:为标志赋予不同的名称(例如'-x', '--long-name', dest='longName').
    注意:默认情况下--long-name使用args.long_name
  • action:用于特定处理某些参数
    • store_true, store_false:对于布尔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']
  • 选项:限制可能的输入(指定为字符串列表,如果是,则为ints type=int).


cri*_*fan 13

代码文件:argparseDemo.py

\n

简单:常见情况

\n
    \n
  • 名称(缩写,完整),有帮助\n
    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)\n
    Run Code Online (Sandbox Code Playgroud)\n
      \n
    • 呼叫\n
        \n
      • python argparseDemo.py -n Crifan
      • \n
      • python argparseDemo.py --name Crifan
      • \n
      \n
    • \n
    • 输出:args=Namespace(name=\'Crifan\')args.name=Crifan
    • \n
    \n
  • \n
  • 类型\n
    argParser.add_argument("-a", "--age", type=int, help="your current age")\nprint("type(args.age)=%s" % type(args.age))\n
    Run Code Online (Sandbox Code Playgroud)\n
      \n
    • 称呼:python argparseDemo.py --age 30
    • \n
    • 输出:type(args.age)=<class \'int\'>args.age=30
    • \n
    \n
  • \n
  • 必需\n
    argParser.add_argument("-a", "--age", required=True, type=int, help="your current age")\n
    Run Code Online (Sandbox Code Playgroud)\n
      \n
    • 称呼:python argparseDemo.py
    • \n
    • 输出:错误argparseDemo.py: error: the following arguments are required: -a/--age
    • \n
    \n
  • \n
  • 默认\n
    argParser.add_argument("-a", "--age", type=int, default=20, help="your current age. Default is 20")\n
    Run Code Online (Sandbox Code Playgroud)\n
      \n
    • 称呼:python argparseDemo.py
    • \n
    • 输出:args.age=20
    • \n
    \n
  • \n
  • 选择\n
    argParser.add_argument("-f", "--love-fruit", choices=[\'apple\', \'orange\', \'banana\'], help="your love fruits")\n
    Run Code Online (Sandbox Code Playgroud)\n
      \n
    • 称呼:python argparseDemo.py -f apple
    • \n
    • 输出:args=Namespace(love_fruit=\'apple\')args.love_fruit=apple
    • \n
    \n
  • \n
  • 多个参数\n
    argParser.add_argument("-f", "--love-fruit", nargs=2, help="your love fruits")\n
    Run Code Online (Sandbox Code Playgroud)\n
      \n
    • 称呼:python argparseDemo.py -f apple orange
    • \n
    • 输出:args.love_fruit=[\'apple\', \'orange\']
    • \n
    \n
  • \n
\n

细节

\n

最简单:-x

\n
    \n
  • 代码:

    \n
    import 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)\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
  • 用法=在命令行中运行

    \n
    python argparseDemo.py -a 30\n
    Run Code Online (Sandbox Code Playgroud)\n
      \n
    • 或:./argparseDemo.py -a 30\n
        \n
      • 确保argparseDemo.py可执行\n
          \n
        • 如果没有,请添加:chmod +x argparseDemo.py
        • \n
        \n
      • \n
      \n
    • \n
    \n
  • \n
  • 输出

    \n
    args.a=30\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
  • 笔记

    \n
      \n
    • 默认类型为str\n
        \n
      • argParser.add_argument("-a")==argParser.add_argument("-a", type=str)
      • \n
      • print("type(args.a)=%s" % type(args.a))->type(args.a)=<class \'str\'>
      • \n
      \n
    • \n
    • args类型为Namespace\n
        \n
      • print("type(args)=%s" % type(args))->type(args)=<class \'argparse.Namespace\'>
      • \n
      \n
    • \n
    • args值为Namespace(a=\'30\')\n
        \n
      • print("args=%s" % args)->args=Namespace(a=\'30\')
      • \n
      • 所以我们可以调用/使用args.a
      • \n
      \n
    • \n
    \n
  • \n
\n

参数名称

\n

完整参数名称:--xxx

\n
    \n
  • 代码\n
    argParser.add_argument("-a", "--age")\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
  • 用法\n
      \n
    • python argparseDemo.py -a 30\n
        \n
      • 或者:python argparseDemo.py --age 30
      • \n
      \n
    • \n
    \n
  • \n
  • 获取解析值:args.age\n
      \n
    • 注意:NOT args.aNOT 存在 args.a
    • \n
    \n
  • \n
\n

包含多个单词的完整参数名称:--xxx-yyy

\n\n

添加帮助说明:help

\n\n

指定参数类型:type

\n
    \n
  • 代码\n
    argParser.add_argument("-a", type=int) # parsed arg is `int`, not default `str`\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
  • 输出\n
      \n
    • print("type(args.a)=%s" % type(args.a))->type(args.a)=<class \'int\'>
    • \n
    • print("args=%s" % args)->args=Namespace(a=30)
    • \n
    \n
  • \n
\n

添加默认值:default

\n
    \n
  • 代码\n
    argParser.add_argument("-a", type=int, default=20) # if not pass a, a use default value: 20\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
  • 效果\n
      \n
    • 用法:python argparseDemo.py
    • \n
    • 输出:print("args.age=%s" % args.age)->args=Namespace(a=20)
    • \n
    \n
  • \n
\n


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

  • 最后一个有意义的argparse示例 (2认同)

qua*_*oft 5

您还可以使用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)
  • 参数类型 - 'flag'、'option' 或 'positional' ( positional) 之一
  • 缩写 ( None)
  • 参数值的类型 - 例如。浮点数,字符串 ( None)
  • 受限选择集 ( ['A', 'B'])

文档:

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

Plac:以简单的方式解析命令行


pav*_*taj 5

对此很陌生,但将 Python 与 Powershell 结合并使用此模板,受到深入而出色的Python 命令行参数 \xe2\x80\x93 Real Python 的启发

\n

您可以在其中做很多事情init_argparse(),我在这里仅介绍最简单的场景。

\n
    \n
  1. import argparse
  2. \n
  3. 使用if __name__ == "__main__": main()模式从终端执行
  4. \n
  5. 解析main()函数中没有参数的参数
  6. \n
  7. 定义一个init_argparse()函数\n
      \n
    • 通过调用创建解析器对象argparse.ArgumentParser()
    • \n
    • 声明一个或多个参数parser.add_argument("--<long_param_name>")
    • \n
    • 返回解析器
    • \n
    \n
  8. \n
  9. args通过调用创建对象来解析 argsparser.parse_args()
  10. \n
  11. param1用, param2, ...定义一个适当的函数
  12. \n
  13. 调用function_proper时将参数指定为args对象的属性\n
      \n
    • 例如function_proper(param1=args.param1, param2=args.param2)
    • \n
    \n
  14. \n
  15. 在 shell 中使用命名参数调用模块:\n
      \n
    • 例如python foobar.py --param1="foo" --param2=="bar"
    • \n
    \n
  16. \n
\n
#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()\n
Run Code Online (Sandbox Code Playgroud)\n
>>> python .\\foobar.py --param1="foo" --param2=="bar"\n
Run Code Online (Sandbox Code Playgroud)\n