Python运维(二)--脚本

一、系统模块sys

1.1 获取命令行参数

  • argv_test.py
    import sys
    print(sys.argv)
    
  • 测试
    python3 argv_test.py a b 3306
    > ['argv_test.py', 'a', 'b', '3306']
    

1.2 获取标准输入

1.2.1 简易读取标准输入

  • stdin_test.py
    import sys
    for line in sys.stdin:
        print(line, end="")
    
  • 测试
    # 方法一:结合管道
    cat message.txt | python3 stdin_test.py
    # 方法二:通过标准输入
    python3 stdin_test.py < /root/message.txt
    

1.2.2 多文件处理

  • file_test.py
    import fileinput
    
    for line in fileinput.input():
    			# 当前读取的文件名
       meta = [fileinput.filename(), \
       		   # 当前行号
       		   fileinput.filelineno(), \
       		   # 是否是首行
       		   fileinput.isfirstline(), \
       		   # 是否是标准输入
       		   fileinput.isstdin()]
       print(*meta)
       print(line)
    
  • 测试:直接读取文件
    # 读取文件
    python3 file_test.py message.txt message1.txt
    # 当前文件名、当前行号、是否是首行、是否是标准输入
    > message.txt 1 True False
    > a
    >
    > message.txt 2 False False
    > ab
    > 
    > message.txt 3 False False
    > abc
    > 
    > message1.txt 1 True False
    > a
    > ......
    
  • 测试:管道读取文件
    cat message.txt| python3 file_test.py 
    > <stdin> 0 1 True True
    > a
    > 
    > <stdin> 0 2 False True
    > ab
    > 
    > <stdin> 0 3 False True
    > abc
    > 
    > <stdin> 0 4 False True
    > abcd
    

1.3 脚本执行出错抛出异常

  • error_test.py
    raise SystemExit("Error Message")
    
  • 测试
    python3 error_test.py
    > Error Message
    echo $?
    > 1
    

1.4 读取密码

  • 获取账号密码
    import getpass
    
    user = input("your user:")
    # 会星号显示输入的密码
    passwd = getpass.getpass("your password:")
    print(user,passwd)
    

二、配置文件解析模块ConfigParse

  • 文件格式my.cnf
    [client]
    port		= 3306
    user		= mysql
    password	= mysql
    host		= 127.0.0.1
    
    [mysqld]
    basedir		= /usr
    skip-external-locking
    
  • 读取
    # 导入包、构建对象、读取配置文件
    In [1]: import configparser
    In [2]: cf = configparser.ConfigParser(allow_no_value=True)
    In [3]: cf.read("my.cnf")
    Out[3]: ['my.cnf']
    ##############################################################
    # 读取章节列表
    In [4]: cf.sections()
    Out[4]: ['client', 'mysqld']
    # 判断是否有章节
    In [5]: cf.has_section("client")
    Out[5]: True
    ##############################################################
    # 读取章节下选项列表
    In [6]: cf.options("client")
    Out[6]: ['port', 'user', 'password', 'host']
    # 读取章节下的选项列表
    In [7]: cf.has_option("mysqld","skip-external-locking")
    Out[7]: True
    ##############################################################
    # 读取选项值get、getboolean、getint、getfloat
    In [8]: cf.get("client","port")
    Out[8]: '3306'
    
  • 编辑
    # 增加章节
    In [9]: cf.add_section("web")
    # 增加选项(必须都是字符串,包括数字)
    In [11]: cf.set("web", "port", "80")
    
    # 删除章节
    In [12]: cf.remove_section("client")
    Out[12]: True
    
    # 删除选项
    In [13]: cf.remove_option("mysqld", "basedir")
    Out[13]: True
    
    # 保存配置文件
    In [14]: cf.write(open("my.cnf", "w"))
    
    # 查看修改后配置文件
    In [15]: cat my.cnf
    [mysqld]
    skip-external-locking
    
    [web]
    port = 80
    

三、命令行参数解析模块click

前置:pip3 install click

3.1 文件写法

  • arg_test.py
    import click
    
    # 功能:使hello函数成为命令行入口函数
    @click.command()
    # 参数装饰器:参数名,默认值,--help时显示提示信息
    @click.option("--count", default=1, help="整型参数")
    # prompt:当未输入此值时,会弹出提示信息提示输入,默认为字符串类型
    @click.option("--name", prompt="请输入字符串", help="字符串参数")
    # nargs:表示需要参数数量,pt为一个含有两个浮点数的元组
    # type:参数类型,包含string、int、float、click.Choice
    @click.option("--pt", nargs=2, type=float, help="多参数,元组传入")
    # Choice:限定可选项,字符串
    @click.option("--code", type=click.Choice(["md5","sha1"]), help="选项式参数")
    # 密码:hide_input屏幕不显示输入密码,confirmation_prompt密码输入两次确认
    @click.option("--password", prompt="请输入密码", hide_input=True, confirmation_prompt=True, help="密码")
    # 接收上述传入参数,缺或多都报错
    def hello(count, name, pt, code, password):
    	# 这里显示此命令行简要说明,--help参数中显示
        """这是命令行的简要说明"""
        print("count值为:",count)
        print("name值为:",name)
        print("pt值为:",pt)
        print("code值为:",code)
        print("password值为:",password)
    
    
    if __name__ == "__main__":
        hello()
    

3.2 测试结果

  • 命令行输入
    > python3 arg_test.py --pt=1 2 --code="md5" 
    请输入字符串: abc
    请输入密码: 
    Repeat for confirmation: 
    count值为:1
    name值为:abc
    pt值为:(1.0, 2.0)
    code值为:md5
    password值为:1234
    
  • 帮助信息
    > python3 arg_test.py --help
    Usage: arg_test.py [OPTIONS]
    
      这是命令行的简要说明
    
    Options:
      --count INTEGER    整型参数
      --name TEXT        字符串参数
      --pt FLOAT...      多参数,元组传入
      --code [md5|sha1]  选项式参数
      --password TEXT    密码
      --help             Show this message and exit.
    

    报错:上述任何地方出现问题均会报错直接退出,包括参数类型不对,或者缺、多参数,加try语句

四、交互式命令行模块prompt_toolkit

  • 类似于ipython样式
  • 前置: pip3 install prompt_toolkit
  • prompt_test.py
    from prompt_toolkit import prompt
    # 历史补全文件保存位置:不必要
    from prompt_toolkit.history import FileHistory
    # 历史补全:不必要
    from prompt_toolkit.auto_suggest import AutoSuggestFromHistory
    # 指定提示关键词下拉框表:可保留
    from prompt_toolkit.completion import WordCompleter
    
    # 提示关键词下拉框表
    Completer = WordCompleter(['select', 'exit'], ignore_case=True)
    # 打印欢迎语句
    print("Test:1.0.0, Author: chuck")
    line_num = 0
    
    while True:
    	# 行号
        line_num += 1
        # 获取输入:			行前缀字符串(建议保留)
        user_input = prompt('In [' +str( line_num) + ']: ',
        					# 指定历史补全文件位置:此处为本文件同目录(不必要)
                            history=FileHistory('history.txt'),
                            # 开启历史补全(不必要)
                            auto_suggest=AutoSuggestFromHistory(),
                            # 指定提示关键词下拉框表(可保留)
                            completer=Completer)
        # 退出机制
        if user_input.strip().lower() == 'exit':
            break
        # 以下为逻辑区:循环打印所有输入
        print(user_input)                        
    
  • 效果
    在这里插入图片描述
    在这里插入图片描述
    回到总目录
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值