在本文中,我们将详细介绍Pythonargparse位置参数和子命令的各个方面,并为您提供关于python中argparse的相关解答,同时,我们也将为您带来关于Argparse-不要用`nargs`
在本文中,我们将详细介绍Python argparse位置参数和子命令的各个方面,并为您提供关于python中argparse的相关解答,同时,我们也将为您带来关于Argparse-不要用`nargs`捕获位置参数、Argparse-不要用`nargs`捕获位置参数。、Py 之 argparse:Python 库之 argparse (命令行解析) 简介、安装、使用方法之详细攻略、python argh / argparse:如何将列表作为命令行参数传递?的有用知识。
本文目录一览:- Python argparse位置参数和子命令(python中argparse)
- Argparse-不要用`nargs`捕获位置参数
- Argparse-不要用`nargs`捕获位置参数。
- Py 之 argparse:Python 库之 argparse (命令行解析) 简介、安装、使用方法之详细攻略
- python argh / 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相同,但是事实是,如果后续(顶层)位置参数具有特定的nargs
(nargs
=None
,nargs
=整数),那么它将按您期望的那样工作。当nargs
is''?''
或or''*''
时,它有时会失败''+''
。因此,我深入研究了代码,以了解发生了什么。
归结为将参数拆分为消耗形式的方式。为了弄清楚谁得到了什么,在您的情况下,调用会parse_args
在字符串中汇总参数,例如''AA''
,(''A''
对于位置参数,''O''
对于可选参数),并最终生成一个正则表达式模式以与该摘要字符串匹配,具体取决于您的操作已通过.add_argument
和.add_subparsers
方法添加到解析器。
在每种情况下,例如,参数字符串最终都是''AA''
。变化的是要匹配的模式(您可以在_get_nargs_pattern
in中看到可能的模式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`捕获位置参数
我正在尝试编写一个函数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`捕获位置参数。
我正在尝试编写一个函数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 (命令行解析) 简介、安装、使用方法之详细攻略
导读
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:如何将列表作为命令行参数传递?
我正在尝试使用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:如何将列表作为命令行参数传递?的相关信息,可以在本站进行搜索。
本文标签: