• Python常用命令行工具


    1、使用sys.argv获取命令行参数

    sys.argv就是一个保存命令行参数的普通列表

    示例:

    #!/usr/bin/python3
    # -*-coding:UTF-8-*-
    
    import os
    import sys
    
    
    def main():
        sys.argv.append("")
        filename = sys.argv[1]  # 如果用户直接运行程序,没有传递任何命令行参数,那么访问sys.argv[1]将会出现索引越界的错误,为了避免这个错误,在访问sys.argv之前先向sys.argv中添加一个空的字符串
        if not os.path.isfile(filename):    # 判断文件是否存在
            raise SystemExit(filename + ' does not exists')
        elif not os.access(filename, os.R_OK):  # 如果文件存在,则使用os.access函数判断是否具有对文件的读权限
            raise SystemExit(filename + ' is not accessible')
        else:
            print(filename + ' is accessible')
    
    
    if __name__ == '__main__':
        main()

    2、使用sys.stdin和fileinput读取标准输入

    (1)sys.stdin

    示例:

    #!/usr/bin/python3
    # -*-coding:UTF-8-*-
    
    import sys
    
    for line in sys.stdin:
        print(line, end="")
    
    或者
    def get_content():
        return sys.stdin.readlines()
    
    print(get_content())

    执行:

    python3 xxx.py < /etc/passwd

    cat /etc/passwd | python3 xxx.py

    (2)fileinput

    fileinput读取内容比sys.stdin更加灵活,fileinput既可以从标准输入中读取数据,也可以从文件中读取数据

    示例:

    #!/usr/bin/python3
    # -*-coding:UTF-8-*-
    
    import fileinput
    
    for line in fileinput.input():
        print(line, end="")

    执行:

    python3 xxx.py < /etc/passwd

    cat /etc/passwd | python3 xxx.py

    python3 xxx.py /etc/passwd /etc/hosts

    因为fileinput可以读多个文件内容,所以,fileinput提供了一些方法可以知道当前所读的内容属于哪一个文件。fileinput中常用的方法有:

    filename:当前正在读取的文件名
    fileno:文件的描述符
    filelineno:正在读取的行是当前文件的第几行
    isfirstline:正在读取的行是否当前文件的第一行
    isstdin:正在读取文件还是直接从标准输入读取内容

    示例:

    #!/usr/bin/python3
    # -*-coding:UTF-8-*-
    
    import fileinput
    
    for line in fileinput.input():
        meta = [fileinput.filename(), fileinput.fileno(), fileinput.filelineno(), fileinput.isfirstline(), fileinput.isstdin()]
        print(*meta, end="")
        print(line, end="")

    3、使用SystemExit异常打印错误信

    文件描述符 用途 POSIX名称 stdio流
    0 标准输入 STDIN_FILENO stdin
    1 标准输出 STDOUT_FILENO stdout
    2 标准错误 STDERR_FILENO stderr

    示例:

    #!/usr/bin/python3
    # -*-coding:UTF-8-*-
    
    import sys
    
    sys.stdout.write('hello')
    sys.stderr.write('world')
    sys.stderr.write('error message')
    sys.exit(1)
    # raise SystemExit("error message")

    执行:

    python3 xxx.py >/dev/null

    结果:worlderror message

    python3 xxx.py 2>/dev/null

    结果:hello

    4、使用getpass库读取密码

    getuser函数用来从环境变量中获取用户名,后者用来等待用户输入密码。getpass函数和input函数的区别在于,它不会将输入的密码显示在命令行中,从而避免输入的密码被他人看到

    示例:

    #!/usr/bin/python3
    # -*-coding:UTF-8-*-
    
    import getpass
    
    user = getpass.getuser()
    passwd = getpass.getpass("your password: ")
    print(user,passwd)

    5、使用ConfigParse解析配置文件

    注意:在Python3中,ConfigParser模块重命名为configparser模块,使用上有细微差异

    一个典型的配置文件包含一到多个章节(section),每个章节下可以包含一个到多个选项(option)

    下面以MySQL的配置文件为例:

    [mysqld]
    basedir         = /usr
    datadir         = /var/lib/mysql
    tmpdir          = /tmp
    skip-external-locking
    
    [client]
    user            = mysql
    password        = mysql
    port            = 3306
    host            = 127.0.0.1

    configparser中有很多的方法,其中与读取配置文件,判断配置项相关的方法有:

    sections:返回一个包含所有章节的列表
    has_section:判断章节是否存在
    items:以元组的形式返回所有选项
    options:返回一个包含章节下所有选项的列表
    has_option:判断某个选项是否存在
    get、getboolean、getint、getfloat:获取选项的值

    示例:

    #!/usr/bin/python3
    # -*-coding:UTF-8-*-
    
    import configparser
    
    temp = configparser.ConfigParser(allow_no_value=True)   # allow_no_value=False,表示配置文件中是否允许选项没有值的情况
    
    temp.read('my.cnf')
    print(temp.sections())
    print(temp.has_section('client'))
    print(temp.options('client'))
    print(temp.has_option('client', 'user'))
    print(temp.get('client', 'host'))
    print(temp.getint('client', 'port'))

    配置文件中有2个章节,分别是mysqld和client。其中,client章节有4个选项。可以通过sections方法获取所有的章节,通过options方法获取某个章节下所有的选项,也可以通过has_section方法判断某个章节是否存在,通过has_option方法判断某个选项是否存在。

    在读取选项的内容时,get方法默认以字符串的形式返回。如果需要读取一个整数,则使用getint方法读取;如果需要读取一个布尔的取值,则使用getboolean方法读取。

    configparser也提供了许多方法便于修改配置文件:

    remove_section:删除一个章节
    add_section:添加一个章节
    remove_option:删除一个选项
    set:添加一个选项
    write:将configparser对象中的数据保存到文件中

    示例:

    #!/usr/bin/python3
    # -*-coding:UTF-8-*-
    
    import configparser
    
    temp = configparser.ConfigParser(allow_no_value=True)
    
    temp.read('my.cnf')
    temp.remove_section('client')
    temp.add_section('mysql')
    temp.set('mysql', 'host', '127.0.0.1')
    temp.set('mysql', 'port', '3306')
    temp.write(open('my.cnf', 'w'))

     

  • 相关阅读:
    设计模式之代理模式
    angularJS 常用插件指令
    textarea 输入框限制字数
    IE11报错:[vuex] vuex requires a Promise polyfill in this browser的问题解决
    Oauth2.0协议 http://www.php20.com/forum.php?mod=viewthread&tid=28 (出处: 码农之家)
    申请qq第三方登录 http://www.php20.com/forum.php?mod=viewthread&tid=29 (出处: 码农之家)
    yii2邮箱发送
    错误提示:LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt 的解决方法
    Java面试-List中的sort详细解读
    Java服务器-Disruptor使用注意
  • 原文地址:https://www.cnblogs.com/opsprobe/p/13770723.html
Copyright © 2020-2023  润新知