GVKun编程网logo

Python argparse位置参数和子命令(python中argparse)

9

在本文中,我们将详细介绍Pythonargparse位置参数和子命令的各个方面,并为您提供关于python中argparse的相关解答,同时,我们也将为您带来关于Argparse-不要用`nargs`

在本文中,我们将详细介绍Python argparse位置参数和子命令的各个方面,并为您提供关于python中argparse的相关解答,同时,我们也将为您带来关于Argparse-不要用`nargs`捕获位置参数、Argparse-不要用`nargs`捕获位置参数。、Py 之 argparse:Python 库之 argparse (命令行解析) 简介、安装、使用方法之详细攻略、python argh / argparse:如何将列表作为命令行参数传递?的有用知识。

本文目录一览:

Python argparse位置参数和子命令(python中argparse)

Python argparse位置参数和子命令(python中argparse)

我正在使用argparse,并试图将子命令和位置参数混合使用,然后出现以下问题。

这段代码运行良好:

import argparseparser = argparse.ArgumentParser()subparsers = parser.add_subparsers()parser.add_argument(''positional'')subparsers.add_parser(''subpositional'')parser.parse_args(''subpositional positional''.split())

上面的代码将args解析为Namespace(positional=''positional''),但是当我将位置参数更改为具有nargs =’?’时
因此:

import argparseparser = argparse.ArgumentParser()subparsers = parser.add_subparsers()parser.add_argument(''positional'', nargs=''?'')subparsers.add_parser(''subpositional'')parser.parse_args(''subpositional positional''.split())

出现以下错误:

usage: [-h] {subpositional} ... [positional]: error: unrecognized arguments: positional

为什么是这样?

答案1

小编典典

起初,我认为与jcollado相同,但是事实是,如果后续(顶层)位置参数具有特定的nargsnargs=
Nonenargs=整数),那么它将按您期望的那样工作。当nargsis''?''或or''*''时,它有时会失败''+''。因此,我深入研究了代码,以了解发生了什么。

归结为将参数拆分为消耗形式的方式。为了弄清楚谁得到了什么,在您的情况下,调用会parse_args在字符串中汇总参数,例如''AA'',(''A''对于位置参数,''O''对于可选参数),并最终生成一个正则表达式模式以与该摘要字符串匹配,具体取决于您的操作已通过.add_argument.add_subparsers方法添加到解析器。

在每种情况下,例如,参数字符串最终都是''AA''。变化的是要匹配的模式(您可以在_get_nargs_patternin中看到可能的模式argparse.py。因为subpositional最终会存在''(-*A[-AO]*)'',这意味着
允许一个参数后跟任意数量的选项或参数 。对于positional,它取决于传递给nargs

  • None => ''(-*A-*)''
  • 3 => ''(-*A-*A-*A-*)''''-*A''每个预期参数一个)
  • ''?'' => ''(-*A?-*)''
  • ''*'' => ''(-*[A-]*)''
  • ''+'' => ''(-*A[A-]*)''

这些模式被附加,对于nargs=None(您的工作示例),您最终得到''(-*A[-AO]*)(-*A-*)'',它与两组匹配[''A'',''A'']。这样,subpositional将仅解析subpositional(您想要的内容),同时positional匹配其动作。

因为nargs=''?'',最终您得到''(-*A[-AO]*)(-*A?-*)''。第二组完全由 可选
模式组成,并且*是贪婪的,这意味着第一组将字符串中的所有内容都模糊不清,最终识别出这两个组[''AA'','''']。当然,这意味着subpositional有两个参数,最终会令人窒息。

有趣的nargs=''+''''(-*A[-AO]*)(-*A[A-]*)'',for的模式 只要您仅传递一个参数就可以使用
。说subpositional a,因为您在第二组中至少需要一个位置参数。同样,由于第一组是贪婪的,所以传递subpositional a b cd会获得[''AAAA'', ''A''],这不是您想要的。

简而言之:一团糟。我猜这应该被认为是一个错误,但不确定将模式转变为非贪婪模式会带来什么影响…

Argparse-不要用`nargs`捕获位置参数

Argparse-不要用`nargs`捕获位置参数

我正在尝试编写一个函数wo,您可以通过argparse解析可变数量的参数-
我知道我可以通过做到这一点nargs="+"。可悲的是,argparse帮助的工作方式(以及人们通常在CLI中编写参数的方式)使位置参数处于最后位置。这导致我的位置参数被视为可选参数的一部分。

#!/usr/bin/python
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("positional",help="my positional arg",type=int)
parser.add_argument("-o","--optional",help="my optional arg",nargs='+',type=float)
args = parser.parse_args()
print args.positional,args.optional

运行它,如./test.py -h下面的用法说明所示:

usage: test.py [-h] [-o OPTIONAL [OPTIONAL ...]] positional

但是如果我跑步./test.py -o 0.21 0.11 0.33 0.13 100给我

test.py: error: too few arguments

为了获得正确的参数解析,我必须运行 ./test.py 100 -o 0.21 0.11 0.33 0.13

那么我该如何:

  • 使argparse重新格式化用法输出,以减少误导或更好:

  • 告诉argparse-o如果列表中的最后一个元素不捕获可选参数的最后一个元素

Argparse-不要用`nargs`捕获位置参数。

Argparse-不要用`nargs`捕获位置参数。

我正在尝试编写一个函数wo,您可以通过argparse解析可变数量的参数-
我知道我可以通过做到这一点nargs="+"。可悲的是,argparse帮助的工作方式(以及人们通常在CLI中编写参数的方式)使位置参数处于最后位置。这导致我的位置参数被视为可选参数的一部分。

#!/usr/bin/pythonimport argparseparser = argparse.ArgumentParser()parser.add_argument("positional", help="my positional arg", type=int)parser.add_argument("-o", "--optional", help="my optional arg", nargs=''+'', type=float)args = parser.parse_args()print args.positional, args.optional

运行它,如./test.py -h下面的用法说明所示:

usage: test.py [-h] [-o OPTIONAL [OPTIONAL ...]] positional

但是如果我跑步./test.py -o 0.21 0.11 0.33 0.13 100给我

test.py: error: too few arguments

为了获得正确的参数解析,我必须运行 ./test.py 100 -o 0.21 0.11 0.33 0.13

那么我该如何:

  • 使argparse重新格式化用法输出,以减少误导或更好:

  • 告诉argparse-o如果列表中的最后一个元素不捕获可选参数的最后一个元素

答案1

小编典典

对此有一个错误报告:http :
//bugs.python.org/issue9338

带有nargs =’?’,’*’或’+’的argparse可选参数不能跟位置

一个简单的(用户)修复方法是--用来将位置和可选位置分开:

./test.py -o 0.21 0.11 0.33 0.13 -- 100

我写了一个补丁,保留了一些用于位置的参数。但这不是一件小事。

至于更改用法行,最简单的方法就是编写自己的用法,例如:

usage: test.py [-h] positional [-o OPTIONAL [OPTIONAL ...]]usage: test.py [-h] [-o OPTIONAL [OPTIONAL ...]] -- positional

我不建议在用法格式化程序中添加逻辑以进行此类更改。我认为这太复杂了。

另一个快速解决方案是将此位置转换为(必需)可选。它使用户可以完全自由地订购,并可以减少混乱。如果您不想混淆“ required
optional”,则给它一个逻辑上的默认值。

usage: test.py [-h] [-o OPTIONAL [OPTIONAL ...]] -p POSITIONALusage: test.py [-h] [-o OPTIONAL [OPTIONAL ...]] [-p POS_WITH_DEFAULT]

对Help_Formatter的一个简单更改是仅按照定义的顺序列出参数。修改格式化程序行为的通常方法是将其子类化,并更改一种或两种方法。这些方法大多数都是“专用”(_前缀),因此您意识到将来的代码可能会(缓慢地)更改。

在此方法中,actions是参数列表的定义顺序。默认行为是从“ positionals”中拆分“
optionals”,然后将列表结尾处的位置重新组合。还有其他代码可以处理需要换行的长行。通常,它将位置放在单独的行上。我已经省略了。

class Formatter(argparse.HelpFormatter):    # use defined argument order to display usage    def _format_usage(self, usage, actions, groups, prefix):        if prefix is None:            prefix = ''usage: ''        # if usage is specified, use that        if usage is not None:            usage = usage % dict(prog=self._prog)        # if no optionals or positionals are available, usage is just prog        elif usage is None and not actions:            usage = ''%(prog)s'' % dict(prog=self._prog)        elif usage is None:            prog = ''%(prog)s'' % dict(prog=self._prog)            # build full usage string            action_usage = self._format_actions_usage(actions, groups) # NEW            usage = '' ''.join([s for s in [prog, action_usage] if s])            # omit the long line wrapping code        # prefix with ''usage:''        return ''%s%s\n\n'' % (prefix, usage)parser = argparse.ArgumentParser(formatter_class=Formatter)

产生如下用法行:

usage: stack26985650.py [-h] positional [-o OPTIONAL [OPTIONAL ...]]

Py 之 argparse:Python 库之 argparse (命令行解析) 简介、安装、使用方法之详细攻略

Py 之 argparse:Python 库之 argparse (命令行解析) 简介、安装、使用方法之详细攻略

Py 之 argparse:Python 库之 argparse (命令行解析) 简介、安装、使用方法之详细攻略

导读
python 中的命令行解析最简单最原始的方法是使用 sys.argv 来实现,更高级的可以使用 argparse 这个模块。argparse 从 python 2.7 开始被加入到标准库中,所以如果你的 python 版本还在 2.7 以下,那么需要先手动安装。除了这两种之外,还有其他框架的命令行解析法,比如 TF flags。

 

 

 

 

目录

argparse 简介

1、命令行的应用

argparse 安装

argparse 使用方法

1、一个简单示例

2、深度学习算法的一个小案例

3、最经典结构案例


 

 

 

argparse 简介

      argparse 是 Python 内置的一个用于命令项选项与参数解析的模块,通过在程序中定义好我们需要的参数,argparse 将会从 sys.argv 中解析出这些参数,并自动生成帮助和使用信息。当然,Python 也有第三方的库可用于命令行解析,而且功能也更加强大,比如 docopt,Click。
     python 中的命令行解析最简单最原始的方法是使用 sys.argv 来实现,更高级的可以使用 argparse 这个模块。argparse 从 python 2.7 开始被加入到标准库中,所以如果你的 python 版本还在 2.7 以下,那么需要先手动安装。
      AgPARSE 模块使得编写用户友好的命令行接口变得容易。该程序定义了它需要什么参数,而 AgPARSE 将解析如何解析那些 Sy.ARGV 中的那些参数。当用户给程序无效参数时,AgPARSE 模块也会自动生成帮助和使用消息并发出错误。

1、命令行的应用

        在 ML、DL 中,往往有过多的 Hyperparameter 需要调优,优化算法、学习率、卷积核尺寸等很多参数都需要不断调整,使用命令行参数是非常方便的。有两种实现方式,

  • 1、利用 python 的 argparse 包
  • 2、调用 tensorflow 自带的 app.flags 实现


相关文章
argparse — Parser for command-line options, arguments and sub-commands
TF 之 TF flags:TF flags 的简介、安装、使用方法之详细攻略

 

 

argparse 安装

默认安装


argparse 使用方法

1、一个简单示例

主要有三个步骤:
ArgumentParser ()         #创建对象
add_argument ()           #调用方法添加参数
parse_args ()                # 使用解析添加的参数

基本使用
import argparse
parser=argparse.ArgumentParser()
parser.add_argument("echo",help="echo the string")
args=parser.parse_args()
print args.echo
import argparse

parser = argparse.ArgumentParser(description=''Python之 argparse库的使用说明.'')
parser.add_argument(''frist'', metavar=''a'', type=str,
                    help=''Path to the image to open.'')
parser.add_argument(''second'', metavar=''b'', type=str,
                    help=''Path to the image to save.'')
parser.add_argument(''third'', metavar=''c'', type=str,
                    help=''Prefix for the saved results.'')
args = parser.parse_args()

image_open_path = args.frist
image_save_path = args.second
image_prefix = args.third

2、深度学习算法的一个小案例

调用 python 的 argparse 包,调用函数 parser.parse_known_args () 解析命令行参数。代码运行后得到的 FLAGS 是一个结构体。

import argparse
import sys

parser = argparse.ArgumentParser()
parser.add_argument(''--fake_data'', nargs=''?'', const=True, type=bool,
                      default=False,
                      help=''If true, uses fake data for unit testing.'')
parser.add_argument(''--max_steps'', type=int, default=1000,
                      help=''Number of steps to run trainer.'')
parser.add_argument(''--learning_rate'', type=float, default=0.001,
                      help=''Initial learning rate'')
parser.add_argument(''--dropout'', type=float, default=0.9,
                      help=''Keep probability for training dropout.'')
parser.add_argument(''--data_dir'', type=str, default=''/tmp/tensorflow/mnist/input_data'',
                      help=''Directory for storing input data'')
parser.add_argument(''--log_dir'', type=str, default=''/tmp/tensorflow/mnist/logs/mnist_with_summaries'',
                      help=''Summaries log directory'')
FLAGS, unparsed = parser.parse_known_args()
tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)

3、最经典结构案例

先定义主函数,然后传入 argparse 类型参数变量,每个变量设置默认值。

def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument(''--font_ch'', default=''F:/File_Python/Python_daydayup/data_input/LPR/font/platech.ttf'')
    parser.add_argument(''--font_en'', default=''F:/File_Python/Python_daydayup/data_input/LPR/font/platechar.ttf'')
    parser.add_argument(''--bg_dir'', default=''F:/File_Python/Python_daydayup/data_input/LPR/NoPlates'')
    parser.add_argument(''--out_dir'', default=''F:/File_Python/Python_daydayup/data_input/LPR/plate_train'', help=''output dir'')
    parser.add_argument(''--make_num'', default=100, type=int, help=''num'')     # default=10000
    parser.add_argument(''--img_w'', default=120, type=int, help=''num'')
    parser.add_argument(''--img_h'', default=32, type=int, help=''num'')
    return parser.parse_args()

def main(args):
    G = GenPlate(args.font_ch, args.font_en, args.bg_dir)
    G.genBatch(args.make_num,2,range(31,65), args.out_dir, (args.img_w, args.img_h))

if __name__ == ''__main__'':
    main(parse_args())

 

 

 

 

 

参考文章
Python 命令行解析 argparse 常用语法使用简介

 

python argh / argparse:如何将列表作为命令行参数传递?

python argh / argparse:如何将列表作为命令行参数传递?

我正在尝试使用argh库将参数列表传递给python脚本。可以接受类似以下内容的输入:

./my_script.py my-func --argA blah --argB 1 2 3 4
./my_script.py my-func --argA blah --argB 1
./my_script.py my-func --argA blah --argB

我的内部代码如下所示:

import argh

@argh.arg('--argA',default="bleh",help='My first arg')
@argh.arg('--argB',default=[],help='A list-type arg--except it\'s not!')
def my_func(args):
    "A function that does something"

    print args.argA
    print args.argB

    for b in args.argB:
        print int(b)*int(b)  #Print the square of each number in the list
    print sum([int(b) for b in args.argB])  #Print the sum of the list

p = argh.ArghParser()
p.add_commands([my_func])
p.dispatch()

这是它的行为方式:

$ python temp.py my-func --argA blooh --argB 1
blooh
['1']
1
1

$ python temp.py my-func --argA blooh --argB 10
blooh
['1','0']
1
0
1

$ python temp.py my-func --argA blooh --argB 1 2 3
usage: temp.py [-h] {my-func} ...
temp.py: error: unrecognized arguments: 2 3

这个问题看起来非常简单:argh仅接受第一个参数,并将其视为字符串。如何使它“期望”一个整数列表?

我看到这是如何在optparse中完成的,但是(未弃用的)argparse呢?还是使用argh更好的修饰语法?这些似乎更pythonic。

我们今天的关于Python argparse位置参数和子命令python中argparse的分享就到这里,谢谢您的阅读,如果想了解更多关于Argparse-不要用`nargs`捕获位置参数、Argparse-不要用`nargs`捕获位置参数。、Py 之 argparse:Python 库之 argparse (命令行解析) 简介、安装、使用方法之详细攻略、python argh / argparse:如何将列表作为命令行参数传递?的相关信息,可以在本站进行搜索。

本文标签: