栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python运维(二)--脚本

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python运维(二)--脚本

目录
  • 一、系统模块sys
    • 1.1 获取命令行参数
    • 1.2 获取标准输入
      • 1.2.1 简易读取标准输入
      • 1.2.2 多文件处理
    • 1.3 脚本执行出错抛出异常
    • 1.4 读取密码
  • 二、配置文件解析模块ConfigParse
  • 三、命令行参数解析模块click
    • 3.1 文件写法
    • 3.2 测试结果
  • 四、交互式命令行模块prompt_toolkit

一、系统模块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 
    >  0 1 True True
    > a
    > 
    >  0 2 False True
    > ab
    > 
    >  0 3 False True
    > abc
    > 
    >  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)                        
    
  • 效果


    回到总目录
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/960591.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号