text用法 - python画坐标图




简单的想法:1个参数,3个结果 (6)

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减号栏),但第二个也不起作用:

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

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


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的变量,'no_foo'分别为值False:

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函数可以创建参数的字典结构,如果这样可以让您的生活更轻松。

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

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

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


你也可以使用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 __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
  • 参数类型 - “标志”,“选项”或“位置”( positional )之一
  • 缩写( None
  • 参数值的类型 - 例如。 浮动,字符串( None
  • 有限的选择( ['A', 'B']

文档:

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

Plac:轻松解析命令行


我对原始问题的理解有两方面。 首先,就最简单可能的考虑范例而言,我很惊讶我没有在这里看到它。 当然,简单来说,这也是所有开销都很小的权力,但它可能会让你开始。

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("a")
args = parser.parse_args()

if args.a == 'magic.name':
    print 'You nailed it!'

但是这个立场论点现在是必需的。 如果您在调用此程序时将其忽略,则会出现有关缺少参数的错误。 这导致我到原始问题的第二部分。 马特威尔基似乎想要一个没有命名标签的单个可选参数( - 选项标签)。 我的建议是修改上面的代码,如下所示:

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

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


请注意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)

并进展到较不基础的。

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

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)

还有另一篇摘要介绍,受这篇文章的启发。

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
    #

参数用以下组合来定义:

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时,此参数的描述。
  • default :如果省略arg,则为默认值。
  • type :如果你期望一个floatint (否则是str )。
  • dest :为一个标志赋予不同的名称(例如'-x', '--long-name', dest='longName' )。
    注意:默认情况下--long-name是通过args.long_name访问的
  • action :对某些论据进行特殊处理
    • store_true, store_false用于布尔型参数
      '--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个参数的标志
    ./myscript.py --foo ab => args.foo = ['a', 'b']
  • choices :限制可能的输入(指定为字符串列表,或者如果type=int ,则指定type=int )。






argparse