二、python命令行工具

  1. 命令行是linux下执行程序的主要方式,使用python解析命令行是简单的,有许多有用的模块可供选择,传统程序设计解析参数较为复杂,python以一种较为优雅的方式帮助我们完成这一复杂的过程

  2. sys模块

    • argv
      模块sys中的argv列表中存放了运行python模块时给出的参数列表,argv[0]表示脚本名称,其后为给出的参数。它是一个普通的列表,可以修改
      #!/usr/bin/env python
      import sys
      print 'script name: ', sys.argv[0]
      print 'param list: ', sys.argv[1:]
      
    • 使用stdin和fileinput读取标准输入
      #!/usr/bin/env python
      import sys
      for line in sys.stdin:
          print line
      

      fileinput模块提供了比stdin更加通用的功能,使读取文件的过程更加简单。fileinput会遍历sys.argv[1:]列表,顺序读取文件中的内容,并且提供了一些方法,可以让我们在读取文件时获取一些文件相关的信息



      使用示例如下

      #!/usr/bin/env python
      import sys
      import fileinput
      for line in fileinput.input():
          meta = [fileinput.filename(), fileinput.fileno(), fileinput.filelineno(), fileinput.isfirstline(), fileinput.isstdin()]
          print meta
          print line,
      
  3. 读取用户密码,使用getpass
    输入密码时,我们不希望密码保存进历史记录中

    #!/usr/bin/python
    import getpass
    user = getpass.getuser()
    password = getpass.getpass('your password:')
    print user, password
    
  4. 配置文件解析使用ConfigParser
    有时执行系统命令时,查找指定配置文件,读取参数再执行程序是普遍流程,一般配置文件包含一个或多个章节(section),每个章节下包含许多选项(option)。为了解析配置文件,需要先初始化一个ConfigParser对象,该对象有许多方法可以用来获取,设置选项,初始化时,有一个比较重要的参数allow_no_value,该参数的值决定了是否允许选项值为空,有些配置文件以选项的有无决定操作。
    初始化一个ConfigParser



    使用read方法从配置文件中读取内容



    ConfigParser对象提供了许多方法用于访问配置文件的内容



    ConfigParser对象也提供了许多设置选项的方法




    写入文件
  5. 使用argparse解析命令行参数
    argparse可以根据程序的定义从argv列表中取出特定参数,并自动生成帮助信息。argparse中最重要的一个类是ArgumentParser,解析命令行参数时,先初始化该类,有一个需要注意的参数description,该参数设置程序提示信息。初始化对象之后,使用add_argument方法为程序添加参数,选项如下




    使用parse_args方法获得参数列表(namespace)

    #!/usr/bin/env python
    import argparse
    
    
    def _argparser():
        arg = argparse.ArgumentParser(description="test description")
        arg.add_argument('--host', default="127.0.0.1", help="the host which we will connect", dest="host")
        arg.add_argument('-p', default=3306, type=int, help="the port we connect",dest="port")
        return arg.parse_args()
    
    def main():
        args = _argparser()
        print args
        print args.host
        print args.port
    
    
    if __name__ == '__main__':
        main()
    

    自动生成的命令帮助



    带参数运行


  6. 记录应用程序日志
    日志对程序来说是不可缺少的一环,将程序运行状态记录下来,可以用于排查错误,审计等等。logging模块简化了我们记录日志的操作,logging模块有debug,error,info,warn,critical五个级别的日志,默认情况下将日志内容输出至标准输出。我们可以通过basicConfig函数设置日志的格式,可指定的参数如下



    示例

    #!/usr/bin/env python
    import logging
    
    
    logging.basicConfig(filename='app.log',
                    format='%(asctime)s:%(levelname)s:%(message)s',
                   level=logging.INFO)
    
    logging.info('info')
    logging.debug('debug')
    logging.warn('warn')
    logging.error('error')
    logging.critical('critical')
    

    理解一些logging模块基本概念是必要的Handler日志处理器决定了日志保存在什么地方保存多久,formatter控制日志输出的格式,logger执行记录日志操作。复杂的项目一般将日志配置写入配置文件中

     [loggers]
     root
     
     [handlers]
     logfile
     
     [formatters]
     generic
     
     [logger_root]
     handlers=logfile
     
     [handler_logfile]
     class = handlers.TimeRotatingFileHandler
     args = ('app.log','midnight',1,10)
     level = DEBUG
     formatter = generic
     
     [formatter_generic]
     format='%(asctime)s %(levelname)-5.5s [%(name)s:%(lineno)s] %(message)s'
    
  7. 使用click管理命令参数
    click是一个命令行开源项目,相对于标准库中的argparse,增强了易用性。函数装饰器的概念是我们需要先前理解的。使用click时,首先使用command()装饰一个函数使之成为命令行工具,之后通过option添加参数。option函数常用的选项如下



    示例

     #!/usr/bin/env python
     import click
     
     
     @click.command()
     @click.option('--host',default='127.0.0.1',type=str, prompt='please input host:',help='the host')
     @click.option('--port', default=3306, type=int, prompt="type your port:", help='mysql port')
     def connect(host,port):
         print 'connecting ',host,':',port
     
     connect()
    

    当没有给定参数时,函数运行过程中会提示用户输入,另外click会为我们生成程序帮助



    帮助信息



    使用Choice函数限制参数值的范围
     #!/usr/bin/env python
     import click
     
     @click.command()
     @click.option('--host',type=click.Choice(['127.0.0.1']), prompt='please type host:')
     def hash(host):
         print host
     
     hash()
    

    设置hide_input为True获取用户密码

     #!/usr/bin/env python
     import click
     
     
     @click.command()
     @click.option('--password', prompt=True, hide_input=True, confirmation_prompt=True)
     def getpass(password):
         print 'you password:',password
     
     getpass()
    
  8. 使用prompt_toolkit处理交互式场景
    工具使用非常简单,我们看一些比较常用的特性

     #!/usr/bin/env pypthon
     from prompt_toolkit import prompt
     
     while True:
         user_input=prompt(u'>')
         print user_input
    

    支持终端的一些快捷键



    添加查看历史输入功能

     #!/usr/bin/env python
     from prompt_toolkit import prompt
     from prompt_toolkit.history import FileHistory
     
     while True:
         user_input = prompt(u'>', history=FileHistory('history.txt'))
         print user_input
    

    支持通过上下按键查看历史输入



    添加自动命令提示

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

推荐阅读更多精彩内容