美文网首页我爱编程
二、python命令行工具

二、python命令行工具

作者: zhile_doing | 来源:发表于2018-05-23 11:01 被阅读0次
    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
      

    相关文章

      网友评论

        本文标题:二、python命令行工具

        本文链接:https://www.haomeiwen.com/subject/oqwkjftx.html