GVKun编程网logo

如何创建Python名称空间(argparse.parse_args值)?(python怎么创建命名列表)

10

如果您想了解如何创建Python名称空间的相关知识,那么本文是一篇不可错过的文章,我们将对argparse.parse_args值?进行全面详尽的解释,并且为您提供关于parse_args(argsp

如果您想了解如何创建Python名称空间的相关知识,那么本文是一篇不可错过的文章,我们将对argparse.parse_args值?进行全面详尽的解释,并且为您提供关于parse_args(argsparse):python 和命令行之间的交互、Py 之 argparse:Python 库之 argparse (命令行解析) 简介、安装、使用方法之详细攻略、python argh / argparse:如何将列表作为命令行参数传递?、python argparse的有价值的信息。

本文目录一览:

如何创建Python名称空间(argparse.parse_args值)?(python怎么创建命名列表)

如何创建Python名称空间(argparse.parse_args值)?(python怎么创建命名列表)

为了交互式测试我的python脚本,我想创建一个Namespace对象,类似于所返回的对象argparse.parse_args()。显而易见的方式

>>> import argparse>>> parser = argparse.ArgumentParser()>>> parser.parse_args()Namespace()>>> parser.parse_args("-a")usage: [-h]: error: unrecognized arguments: - aProcess Python exited abnormally with code 2

可能会导致傻子错误导致Python repl退出(如上所述)。

那么, 用给定的属性集创建Python名称空间的最简单方法是什么?

例如,我可以dict即时创建一个(dict([("a",1),("b","c")])),但不能将其用作Namespace

AttributeError: ''dict'' object has no attribute ''a''

答案1

小编典典

您可以创建一个简单的类:

class Namespace:    def __init__(self, **kwargs):        self.__dict__.update(kwargs)

argparse Namespace在属性方面,它的工作方式与类完全相同:

>>> args = Namespace(a=1, b=''c'')>>> args.a1>>> args.b''c''

或者,只需 导入类 ;可从argparse模块中获得:

from argparse import Namespaceargs = Namespace(a=1, b=''c'')

从Python
3.3开始,还有types.SimpleNamespace,它实际上做同样的事情:

>>> from types import SimpleNamespace>>> args = SimpleNamespace(a=1, b=''c'')>>> args.a1>>> args.b''c''

这两种类型是不同的。SimpleNamespace主要用于sys.implementation属性和的返回值time.get_clock_info()

进一步比较:

  • 这两个类都支持相等性测试。对于相同类的两个实例,instance_a == instance_b如果它们具有相同的属性且具有相同的值,则为true。
  • 这两个类都有助于__repr__显示它们具有哪些属性。
  • Namespace()对象支持遏制测试;''attrname'' in instance如果名称空间实例具有属性namend,则为true attrnameSimpleNamespace才不是。
  • Namespace()对象具有未公开的._get_kwargs()方法,该方法返回(name, value)该实例的属性的排序列表。您可以使用任一类获得相同的结果sorted(vars(instance).items())
  • 虽然SimpleNamespace()用CNamespace()实现并用Python实现,但是属性访问并没有更快,因为它们都使用相同__dict__的属性存储。对于SimpleNamespace()实例,相等性测试和生成表示形式要快一些。

parse_args(argsparse):python 和命令行之间的交互

parse_args(argsparse):python 和命令行之间的交互

初始化

假设我们创建一个 “argp.py” 的文件。

import argparse     # 引入模块
# 建立解析对象
parser = argparse.ArgumentParser()

parser.add_argument("echo")         # xx.add_argument("aa")
# 给xx实例增加一个aa属性

# 把parser中设置的所有"add_argument"给返回到args子类实例当中
# 那么parser中增加的属性内容都会在args实例中,使用即可。
args = parser.parse_args()
parser.parse_args()
print(arg.echo)     # 打印定位参数echo

运行的话,在python argp.py后面加上abcd(任意);

其将输出 “abcd”。因为我们把abcd赋给了args.echo了。

给其设置 help:
parser.add_argument("echo", help = "echo is here~")

在命令行中输入:
python argp.py -h
就可以得到相关的帮助信息。

type

假设我们写一个文件,在命令行将其编译时,同时输入一个数字,返回一个平方:
因为parse.add_argument() 对于接受的值默认其为 str,如果要将之视为 int 类型,额外加一句 “type=int”。

import argparse
parser = argparse.ArgumentParser()

parser.add_argument("square", help = "To sqaure the number given", type = int)
# 在命令行中,该py文件希望用户能给他一个参数,最终将之转化为:args.square

args = parser.parse_arg()
print(args.square**2)  

有了 type 程序也可以自动过滤掉相关的不符合类型的参数输入。

可选参数

add_argument前,给属性名之前加上 “—”,就能将之变为可选参数。

import argparse
parser = argparse.ArgumentParser()

parser.add_argument("--bool",help = "Whether to pirnt sth.")
# 这里的bool是一个可选参数,返回给args的是 args.bool
args = parser.parse_args()

if arg.bool:
    print(''bool = 1'')

对于简单程序,我们可能只需要两种值 TrueorFalse:输入
python argp.py --bool 1
得到
bool = 1
既然是可选的,如果不指定(就是不使用它)的话,对应的变量会被设置为 None。

对于简单程序,我们可能只需要两种值 TrueorFalse

我们可以在原有的程序的基础上,在add_argument中多加一个参数:
action = "store_true"
这个时候,只要在命令行中加个 bool,args.bool 就是True了,无需再加上之后的赋值内容,加了反而会报错。
但是,如果在parser.add_argument(..., required=True,type=int)的话,那么这个参数就是必须的,因为他是 required


参数简写

parser.add_argument("-b","--bool",action="store_true")
这样,在程序内部我们依旧使用args.bool,但是在命令行当中我们只需要多写一个 “-b” 就好了。

混合定位参数和可选参数

当我们使用多个parser.add_argument(...)的时候,若将之视为可选参数,无则为 None。

import argparse
parser = argparse.ArgumentParser()

parser.add_argument("-b","--bool",help="to show the ans in a sentencen form",action = "store_true")
parser.add_argument("square",type=int)

args = parser.parse_args() 

ans = args.square**2

if args.bool:
    print("the square of {} = {}".format(args.square,ans))
else:
    print(ans)
# 得到的效果为:一旦输入“-b”然后再输入相关的参数,就可以得到我们需要的结果了,不输入“-b”我们还是可以得到结果,只不过是另外一种方式而已。

  

限制输入的值:进一步,我们可以进行以下操作,或者对之进行一些了解:

  • parser.add_argument("-b","--bool",choices=[0,1],help="you can only input 0 or 1.")
    其中,choice可以限定我们能够输入的数。
  • 参数值和顺序:
    一般我们要把可选参数最后 add,不可选参数放前面 add。
    而在命令行里面输入代码时,程序会先赋值 “先 add 的参数选项”。
    比如我先 parser.add_argument (“a”,…) 再 b;
    输入命令行的时候:python xx.py x y,这个时候,args.a=x ; args.b=y。
  • count 操作计数赋值:
    parser.add_argument("-b","--bool",action="count",type=int)
    这个时候,在命令后加上 -b ——> bool=1 ; -bb ——> bool=2 ; 以此类推。
    但是这样的话,如果在程序里拿 bool 作为比较对象的时候,比如 if bool > 0:, 不写 “-b” 的时候会报错,原因是此时的 bool 是None, 无法比较,要解决这个问题我们只需要加上一个 default 选项:parser.add_argument("-b","--bool",action="count",type=int,default=0)就好了。

高级用法

光上面那点知识,怕是根本算不上炫酷。我们肯定需要更牛逼的办法。

  • 一个 py 文件的文件名字为 “__file__”
  • 参数冲突:
    我们可以通过group方法,来让 group 组的参数不可以被同时指定:
    import argparse
    
    parser = argparse.ArgumentParser()
    
    group = parser.add_mutually_exclusive_group()
    group.add_argument("-f","--form",action="store_true")
    group.add_argument("-F","--Form",action="store_true")
    parser.add_argument("x",type = float)
    parser.add_argument("y",type = float)
    
    args = parser.parse_args()
    ans = args.x**args.y
    
    if args.form:
        print("{} to the power {} equals {}".format(args.x, args.y, ans))
    elif args.Form:
        print("{}^{} = {}".format(args.x,args.y,ans))
    else:
        print(ans)

      注意点:帮助信息中若有 “[a | b]” 就意味着,ab 不可以同时使用。

    • 在参数简写的时候不要定义 “-h”,这个是给 help 用的。
    • 如果你设置了几个同类型(比如 int)的可选参数,并且给他们简写参数了,比如:
      x -> -x ; y -> -y …
      那么在命令行赋值的时候就应该写:
      ... -x 10 -y 100
      x = 10 ; y = 100 ;

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

–help标签

–help标签在使用argparse模块时会自动创建,一般情况不需要我们主动定义帮助信息。

positional arguments

位置参数与sys.argv调用比较像,参数没有显式的–xxx或者-xxx标签。位置参数都是required的。

parser.add_argument(''filename'')  # 运行时第一个参数赋予名为filename的键
args = parser.parse_args()
print "Read in %s" %(args.filename)

执行python test.py test.txt则会输出Read in test.txt

位置参数较简单,但因为位置固定,且必须有,不够灵活。

标签参数应用的更广泛。

help

参数作用解释

parser.add_argument(''-s'', dest=''server'', type=str, required=False, default=''localhost:8080'', help=u''服务地址'')

required

参数是否为必需的,默认为False。required不能用于位置参数。

parser.add_argument(''-v'', ''--verbose'', type=str, required=True)

上述代码中-v与–verbose可以同时使用。

nargs

限定输入的位置参数或者带标签参数的个数,默认为1。

parser.add_argument(''num'', nargs=2, type=int)表示脚本可以读入两个整数赋予num键(此时的值为2个整数的数组)。

nargs取值如下:
N
‘*’ 表示如果有该位置参数输入的话,之后所有的输入都将作为该位置参数的值
‘?’ 表示该位置参数要么没有,要么就只要一个
‘+’ 表示读取至少1个该位置参数

type

参数类型,如果执行时类型不符则报错。默认为str

type还可以表示文件操作的类型从而直接进行文件的读写操作。

parser.add_argument(''file'', type=argparser.FileType(''r''))  # 读取文件
args = parser.parse_args()
for line in args.file:
    print line.strip()

default

参数默认值,执行时没有该参数时则使用默认值。

parser.add_argument(''filename'', default=''text.txt'')

执行python text.py就能得到Read in text.txt而不需要输入文件名了。

dest

参数在程序中对应的变量名称

parser.add_argument(''a'', dest=''code_name'')

choices

参数能接受的值只能来自指定的候选值,否则会报错:

parser.add_argument(''filename'', choices=[''test1.txt'', ''text2.txt''])

action

store:默认action模式,存储值到指定变量。
store_const:存储值在参数的const部分指定,多用于实现非布尔的命令行flag。
store_true / store_false:布尔开关。 store_true.默认为False,输入则为true。 store_flase 相反
append:存储值到列表,该参数可以重复使用。
append_const:存储值到列表,存储值在参数的const部分指定。
count: 统计参数简写输入的个数 add_argument(“-c”, “–gc”, action=”count”)
version 输出版本信息然后退出。

const

配合action=”store_const|append_const”使用,默认值

metavar

这个参数用于 help 信息输出中

The name to be used for the option’s argument with the help string. If None, the ‘dest’ value will be used as the name.

参数的几种写法

最常见的空格分开:

-x X --foo FOO

长选项用=分开:

--foo=FOO

短选项可以写在一起:

-xX

关于如何创建Python名称空间argparse.parse_args值?的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于parse_args(argsparse):python 和命令行之间的交互、Py 之 argparse:Python 库之 argparse (命令行解析) 简介、安装、使用方法之详细攻略、python argh / argparse:如何将列表作为命令行参数传递?、python argparse的相关知识,请在本站寻找。

本文标签: