Python-解析命令行参数的两中方式

第一种:getopt

# 第一种方式获取输入参数 - getopt

# opts为分析出的格式信息,是一个两元组的列表。每个元素为:(选项串,附加参数)。如果没有附加参数则为空串''。
# args为不属于格式信息的剩余的命令行参数。
# eg:python parameter.py -l 1 -c 2 --list 3 5 6
# opts=[(-l,1),(-c,2),(--list 3)]  args=[5,6]

# getopt只能处理简单的参数,getopt通过遍历sys.argv里的所有参数,如果'-'开始者认为是短参数
# 类型,截取掉'-'后作为cmd(命令),在取第二个参数为命令的value,'--'同理,然后把cmd,value以
# 一个元组存储,放到opts列表里,不带'-','--'者当着不带格式的参数,然后放到args列表里,使用getopt并不能指定参数的类型。
if 0:

    try:
        #第一个参数是程序本身 即 parameter.py
        print(sys.argv[0])
        #解析参数
        opts,args = getopt.getopt(sys.argv[1:],'l:t:',["list=","target="])
        print(opts)
        print(args)
    except getopt.GetoptError:
        pass

第二种 : argparse

python官方文档

  • argparse一种方便用户构建命令行参数的接口,知道怎么解析sys.argv参数,也能够自动生成help帮助文档,
    使用说明,错误提示等

  • 使用简单步骤:

# 创建argparse解析器实例
parser = argparse.ArgumentParser(
    prog='my parameter',
    usage='-- test usage',
    description = textwrap.dedent('''\
            Please do not mess up this text!
         --------------------------------
            I have indented it
             exactly the way
             I want it
         '''),
    epilog='''likewise for this epilog whose whitespace will
            be cleaned up and whose words will be wrapped
            across a couple lines''',
    # '-+',就可以用'-','--','+','++'来添加参数了
    prefix_chars='-+', 
    # 有时,例如在处理特别长的参数列表时,将参数列表保存在文件中而不是在命令行输入它可能是有意义的。
    # 如果将fromfile_prefix_chars =参数赋予ArgumentParser构造函数,则以任何指定字符开头的参数将被视为文件,并将被它们包含的参数替换。:
    fromfile_prefix_chars='@',
    formatter_class=argparse.RawDescriptionHelpFormatter,
    argument_default=argparse.SUPPRESS,
    # 是否允许长参数
    allow_abbrev=True,
    #是否添加help参数
    add_help= True
)
# 参数说明

    #  prog - 程序的名称 (default: sys.argv[0],即parameter.py,当然自己可以修改)
    #  usage - 使用说明 (default: generated from arguments added to parser)
    #  description - 显示在参数帮助说明前面的描述 (default: none)
    #  epilog - 显示在参数帮助说明后面的描述 (default: none)
    #  parents - A由ArgumentParser对象组成的列表,它们的arguments选项会被包含到新ArgumentParser对象中。(类似于继承)
    #  formatter_class - help信息输出的格式
    #  prefix_chars - 参数前缀, (default: ‘-‘),通过prefix_chars来设置其它前缀,eg:'-+',就可以用'-','--','+','++'来添加参数了
    #  fromfile_prefix_chars - The set of characters that prefix files from which additional arguments should be read (default: None)
    #  argument_default - The global default value for arguments (default: None)
    #  conflict_handler - The strategy for resolving conflicting optionals (usually unnecessary)
    #  add_help - 添加'-h','--help'到参数中 (default: True)
    #  allow_abbrev - Allows long options to be abbreviated if the abbreviation is unambiguous. (default: True)
  • 添加参数 - 从命令行获取一个整数列表
parser.add_argument('-l','--list',dest='list',metavar='N',nargs='+',help='get int list')
# parser.add_argument('list',metavar='N',nargs='+',help='get int list') (不带'-'写法)

# add_argument有两个可变长参数:*args, **kwargs,* 表示接收的参数作为元组来处理,** 接收的参数作为字典来处理
# *args = ('-l','--list') **kwargs = {'dest':'list','metavar':'N','nargs':'+','help':'get int list'}

# 参数说明
    # name or flags - 一个名字或者是一个列表,表示了选择参数, e.g. foo or -f, --foo.(parser.add_argument('-f', '--foo'))
    # action - 读取的参数中出现指定参数的时候的行为(默认值是 store。)

        # store_const,表示赋值为const;
        # append,将遇到的值存储成列表,也就是如果参数重复则会保存多个值;
        # append_const,将参数规范中定义的一个值保存到一个列表;
        # count,存储遇到的次数;此外,也可以继承 argparse.Action 自定义参数解析;

    # nargs - 应该从命令后读取的参数的数量
        # 类似正则表达式
        # OPTIONAL = '?'
        # ZERO_OR_MORE = '*' 
        # ONE_OR_MORE = '+' 只是读取一个参数
        # PARSER = 'A...'
        # REMAINDER = '...'
        # _UNRECOGNIZED_ARGS_ATTR = '_unrecognized_args'
    # const - 保存一个常量
    # default - 不指定参数时的默认值。
    # type - 命令行参数应该被转换成的类型。
    # choices - 参数可允许的值的一个容器。
    # required - 可选参数是否可以省略 (仅针对可选参数)。
    # help - 帮助说明
    # metavar - 帮助信息中显示的参数名称
    # dest - 参数的key,用来获取具体的参数值.
  • 解析参数
# -----fromfile_prefix_chars
# with open('args.txt', 'w') as fp:
#     fp.write('-f\nbar')
#     parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
#     parser.add_argument('-f')
#     parser.parse_args(['-f', 'foo','@args.txt'])
# argf = parser.parse_args()
# print(argf)

# -----parents
# parent_parser = argparse.ArgumentParser(add_help=False)
# parent_parser.add_argument('--parent', type=int)

# foo_parser = argparse.ArgumentParser(parents=[parent_parser])
# foo_parser.add_argument('foo')
# foo_parser.parse_args(['--parent', '2', 'XXX'])

args = parser.parse_args()
print(args) 
print(args.list)

# 执行命令:python3 parameter.py -l 1 2 3 4
# 输出:
# Namespace(list=['1', '2', '3', '4'])
# ['1', '2', '3', '4']

# 执行命令:python3 parameter.py -h
# 输出:
# usage: parameter.py [-h] [-l N [N ...]]

# two num add

# optional arguments:
#   -h, --help    show this help message and exit
#   -l N [N ...]  get int list

源码

拓展知识:fire库用法

  • 在命令行通过命令的方式调用python组建和方法等
 import fire
class Calculator(object):
  """A simple calculator class."""

  def double(self, number):
    return 2 * number

if __name__ == '__main__':
  fire.Fire(Calculator)
  • 执行命令:python3 fire_study.py double 10
  • 输出:20
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,504评论 4 365
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,898评论 1 300
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,218评论 0 248
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,322评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,693评论 3 290
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,812评论 1 223
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,010评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,747评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,476评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,700评论 2 251
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,190评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,541评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,206评论 3 240
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,129评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,903评论 0 199
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,894评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,748评论 2 274

推荐阅读更多精彩内容