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

config = configparser.ConfigParser(allow_no_value=True)   # allow_no_value=False,表示配置文件中是否允许选项没有值的情况

config.read('my.cnf')
print(config.sections())
print(config.has_section('client'))
print(config.options('client'))
print(config.has_option('client', 'user'))
print(config.get('client', 'host'))
print(config.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

config = configparser.ConfigParser(allow_no_value=True)

config.read('my.cnf')
config.remove_section('client')
config.add_section('mysql')
config.set('mysql', 'host', '127.0.0.1')
config.set('mysql', 'port', '3306')
config.write(open('my.cnf', 'w'))

 

posted @ 2020-10-05 18:16  OpsDrip  阅读(945)  评论(0编辑  收藏  举报