Python如何解析命令行参数

本文使用的运行环境为 Python3

我们在用Python写命令行工具的时候,难免要让工具接受外部参数或者option选项。比如这样一个工具,接受-h -c --count --verbose四个option选项。-h显示帮助,-c或者--count向命令行工具传递参数count,--verbose显示额外输出信息。

./tool.py -h
./tool.py -c 3
./tool.py --count 3
./tool.py --verbose

上面列举了四种使用情况。接下来我们就看代码。

import getopt
import sys

def main(argv):
    try:
        opts, args = getopt.getopt(argv, "hc:", ["count=", "verbose"])
    except getopt.GetoptError:
        sys.exit(2)
    for opt, arg in opts:
        if opt in ['-h']:
            print('this is help')
        elif opt in ['-c','--count']:
            print('count is {0}'.format(arg))
        elif opt in ['--verbose']:
            print('verbose is enable')

if __name__ == '__main__':
    main(sys.argv[1:])

我们使用getopt来处理命令行参数,因为sys.argv第一个值是可执行文件路径,所以从第二个值开始处理。

main(sys.argv[1:])
...
opts, args = getopt.getopt(argv, "hc:", ["count=", "verbose"])

我们再来看看"hc:",和["count=", "verbose"]这两个参数。
"hc:"表示的是短option列表,如果短option携带了参数,后面加上:,比如c:,反之不带:,比如h
["count=", "verbose"]表示的是长option列表,如果长option携带了参数,后面加上=,比如count=,反之不带=,比如verbose
接下来就是根据不同的option和arg来执行相应的逻辑。

for opt, arg in opts:
        if opt in ['-h']:
            print('this is help')
        elif opt in ['-c','--count']:
            print('count is {0}'.format(arg))
        elif opt in ['--verbose']:
            print('verbose is enable')

opts是(opt,opt_arg)的数组,所以可以通过for opt, arg in opts:直接遍历处理。
opts, args = getopt.getopt(argv, "hc:", ["count=", "verbose"])中还返回了args,这里面放的是非option的参数。读者可以自己动手看一下里面的值是什么。

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

推荐阅读更多精彩内容

  • getopt:和C中的getopt()等价。optparse:2.7后已不推荐使用。argparse:基于optp...
    顾慎为阅读 8,664评论 1 10
  • sys.argv sys.argv[0]是脚本文件的名字,如:test.py sys.argv[1:]是以空格分割...
    f9f73935e28c阅读 21,041评论 0 0
  • 对CLI程序来说,参数解析大概是一个首要的问题。 当然,也有例外。 无参数脚本 许多常用命令,不需要输入参数,就可...
    匿蟒阅读 10,057评论 1 5
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,110评论 2 34
  • 1.放下恐惧。放下世俗观念,追随内心的声音,超出人们的固有期待;放 下恐惧担心犯错。谢丽尔:完成比完美更重要。有时...
    夜莺Christy阅读 124评论 0 0