Python:命令行工具argparse模块的使用方法

1. 写在前面

首先,如果你只是希望传一丢丢数据进去,那么只看下面两行就行了

import sys
print("输入的参数为:%s" % sys.argv[1])
>> python demo.py 1
输入的参数为:1

2. 使用步骤

2.1 使用基本四步

1. import argparse # 导入模块
2. parser = argparse.ArgumentParser() # 创建一个解析对象
3. parser.add_argument() # 向该对象中添加命令行参数和选项
4. args = parser.parse_args() # 进行解析

2.2 举个栗子

temp.py:

import argparse
import sys

#这是一个可以通过命令行进行互动的计算器
def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--x', type=float, default=1.0,
                        help="What is the first number?")
    parser.add_argument('--y', type=float, default=1.0,
                        help="What is the second number?")
    parser.add_argument('--operation', type=str, default='add',
                        help='What operation? (add, sub, mul, or div?)')
    args = parser.parse_args()
    sys.stdout.write(str(calc(args)))

def calc(args):
    if args.operation == 'add':
        return args.x + args.y
    elif args.operation == 'sub':
        return args.x - args.y
    elif args.operation == 'mul':
        return args.x * args.y
    elif args.operation == 'div':
        return args.x / args.y

if __name__ == '__main__':
    main()

一定要在命令行,也就是windows下的command line tool或者mac下的terminal,运行我们的python程序才会看到效果哦。

>> python temp.py -h
usage: temp.py [-h] [--x X] [--y Y] [--operation OPERATION]

optional arguments:
  -h, --help            show this help message and exit
  --x X                 What is the first number?
  --y Y                 What is the second number?
  --operation OPERATION
                        What operation? (add, sub, mul, or div?)
>> python temp.py --x=2 --y=3 --operation=mul # 不能写成‘mul’
6.0

3. parser = argparse.ArgumentParser()语句常用参数

prog=None,     # 程序名
usage=None,     # 描述程序用法的字符串
description=None,     # -h或--help时显示的描述性字符串内容,最常用
epilog=None,     # -h/--help时显示的结尾文字
prefix_chars='-',     # 可选参数的前缀字符集(默认:‘-‘)
fromfile_prefix_chars=None,     # 命令行参数从文件中读取
conflict_handler='error',     #定义两个add_argument中添加的选项名字发生冲突时怎么处理,默认处理是抛出异常
add_help=True     # 是否增加-h/--help选项,默认是True

上述参数中一般只使用description给别人描述自己程序是用来干嘛的就行了,其它都不常用。

parser = argparse.ArgumentParser(description='可以这样使用')
parser.description='也可以这样使用'

4. parser.add_argument()用法(最重要)

其所有参数如下:

name or flags - 选项字符串的名字或者列表,例如foo 或者-f, --foo。
action - 在命令行遇到该参数时采取的基本动作类型。
nargs - 应该读取的命令行参数数目。
const - 某些action和nargs选项要求的常数值。
default - 如果命令行中没有出现该参数时的默认值。
type - 命令行参数应该被转换成的类型。
choices - 参数可允许的值的一个容器。
required - 该命令行选项是否可以省略(只针对可选参数)。
help - 参数的简短描述。
metavar - 参数在帮助信息中的名字。
dest - 给parse_args()返回的对象要添加的属性名称
4.1 name or flags

add_argument()方法必须的参数,且位于第一个位置,判断参数是可变参数,还是位置参数,格式要求:

# For name
parser.add_argument('foo')  #这种形式表示位置参数
#For flags(要带上-或者--)
parser.add_argument('-f', '--foo')  #这种形式表示可变参数,前缀可根据parse.ArgumentParser()里面的prefix_char参数来定义

如果用省略方法 -f 赋值的方法,最终会到达 --ff值会传递到这个完整的参数中去。这里值得一提的是,如果没有后面的 --ff只有 -v 的话,那么值也可以通过 args.v 得到。

4.2 action

用来给ArgumenParser对象判断如何处理命令行参数。这个参数算是一个重头戏而且可以继承 argparse.Action 定制自己的 action。

4.2.1 store

‘store’ - 只是保存参数的值。这是默认的动作

4.2.2 store_const

适用于可选参数,用来存储const关键字指定的值(注意const关键字参数默认是几乎没有帮助的None。),最常用于指定某种标记的可选参数。

parser.add_argument('--foo', action='store_const', const=42)

此时,–foo不可再跟值了。如果不指定为None。

4.2.3 store_true和store_false

属于store_const的特殊用法,设定const的默认值为True或False并分别进行存储

arser.add_argument('--foo', action='store_true')

此时,–foo不可再跟值了。如果不指定为False。

4.2.4 append

将每个参数的值追加到一个列表里面,这对于允许指定多次的选项很有帮助

parser.add_argument('--foo',action='append')
args = parser.parse_args('--foo a --foo b --foo c'.split())
...
>> python temp.py
['a', 'b', 'c']
4.2.5 append_const

保存一个列表,并将const关键字参数指出的值附加在列表的后面,在多个参数需要保存常量到相同的列表时特别有用

parser.add_argument('--str', dest='types', action='append_const', const=str)
parser.add_argument('--int', dest='types', action='append_const', const=int)
4.2.6 count

计算关键字参数出现的次数。例如,这可用于增加详细的级别:

parser.add_argument('-v',action='count')
4.2.7 自定义 action 的实现
class FooAction(argparse.Action):
	def __call__(self, parser, namespace, values, option_string=None):
		print('%r %r %r' % (namespace, values, option_string)
         	setattr(namespace, self.dest, values))
...
parser.add_argument('--foo', action=FooAction)
...

namespace 参数是一个 namespace 对象,values 就是给定的值, option_string 如果有可选参数就会加入进这个,如果没有则为 None。

4.3 nargs

这个入参可以设置一个 参数后面可以接收几个值,而且提供了类似于正则的符号来通配一些行为。

4.3.1 N(一个正整数)

将命令行中的N个参数将被一起收集在一个列表中

parser = argparse.ArgumentParser()
parser.add_argument('--foo', nargs=2)
parser.add_argument('bar', nargs=1)
parser.parse_args('c --foo a b'.split())
...
bar=['c'], foo=['a', 'b']

注意nargs=1生成一个只有一个元素的列表。这和默认的行为是不一样的,默认情况下生成的是元素自己。

4.3.2 ‘?’(零个或一个参数)

如果有的话就从命令行读取一个参数并生成一个元素。如果没有对应的命令行参数,则产生一个来自default的值。注意,对于可选参数,有另外一种情况 - 有选项字符串但是后面没有跟随命令行参数。在这种情况下,将生成一个来自const的值。

parser = argparse.ArgumentParser()
parser.add_argument('--foo', nargs='?', const='c', default='d')
parser.add_argument('bar', nargs='?', default='d')
parser.parse_args('XX --foo'.split())

>> bar='XX', foo='c'
...
parser.parse_args(''.split())
>> bar='d', foo='d'

nargs=’?'的一种更常见的用法是允许可选的输入和输出文件:

parser.add_argument('infile', nargs='?', type=argparse.FileType('r'),default=sys.stdin)
parser.add_argument('outfile', nargs='?', type=argparse.FileType('w'),default=sys.stdout)
4.3.3 ‘+‘和’*’

出现的所有命令行参数都被收集到一个列表中。除此之外,如果没有至少出现一个命令行参数将会产生一个错误信息。

parser.add_argument('foo', nargs='+')
4.4 const

const 参数在某些特定的 action 上面已经介绍到了会被使用,还有就是 nargs 是 ‘?’ 的时候会优先使用 const 里面的值。

4.5 default

对于参数,default的值用于选项字符串没有出现在命令行中的时候。

parser.add_argument('--name', default='Great')
4.6 type

默认的参数类型是str类型,如果你的程序需要一个整数或者布尔型参数,你需要设置type=int或type=bool。

parser.add_argument('foo', type=int) #指定参数类型为整型
parser.add_argument('bar', type=open) #指定对于参数进行open操作
4.7 choices

用于界定参数的取值范围

parser.add_argument('door', type=int, choices=range(1, 4))
4.8 required

表示这个参数是否一定需要设置

parser.add_argument('-name', required=True)
4.9 help

指定参数的说明信息

parser.add_argument('-arch', required=True, choices=['alexnet', 'vgg'],
        help='the architecture of CNN, at this time we only support alexnet and vgg.')
4.10 metavar

当ArgumentParser生成帮助信息时,它需要以某种方式引用每一个参数。 默认情况下,ArgumentParser对象使用dest的值作为每个对象的“名字”。默认情况下,对于位置参数直接使用dest的值,对于可选参数则将dest的值变为大写。所以,位置参数dest='bar’将引用成bar。后面带有一个命令行参数的可选参数–foo将引用成FOO。一个例子:

# first
parser = argparse.ArgumentParser()
parser.add_argument('--version')
args = parser.parse_args('--version 1'.split())
parser.print_help()
>>>python temp.py
usage: temp.py [-h] [--version VERSION]

optional arguments:
  -h, --help         show this help message and exit
  --version VERSION
# second
parser = argparse.ArgumentParser()
parser.add_argument('--version', dest='spl')
args = parser.parse_args('--version 1'.split())
parser.print_help()
>>>python temp.py
usage: temp.py [-h] [--version SPL]

optional arguments:
  -h, --help     show this help message and exit
  --version SPL

可以用metavar指定另外一个名字:

# third
parser = argparse.ArgumentParser()
parser.add_argument('--version', dest='spl', metavar='FWJ')
args = parser.parse_args('--version 1'.split())
parser.print_help()
>>>python temp.py
usage: temp.py [-h] [--version FWJ]

optional arguments:
  -h, --help     show this help message and exit
  --version FWJ

注意metavar只会改变显示出来的名字parse_args() 对象中属性的名字仍然由dest的值决定。

nargs的不同值可能导致metavar使用多次。传递一个列表给metavar将给每个参数指定一个不同的显示名字:

parser.add_argument('--foo', nargs=2, metavar=('bar', 'baz'))
4.11 dest

使用parse_args()对参数进行解析后,一个属性对应一个参数的值,而该属性值正是dest的值,默认情况下,对于位置参数,就是位置参数的值,对于可选参数,则是去掉前缀后的值

parser.add_argument('--version', dest='spl', metavar='FWJ')
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值