opsprobe

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\'))

 

分类:

技术点:

相关文章:

  • 2021-11-04
  • 2021-05-08
  • 2021-10-08
  • 2021-11-14
  • 2021-11-12
  • 2021-11-04
猜你喜欢
  • 2021-01-04
  • 2021-11-03
  • 2021-12-23
  • 2021-11-04
  • 2021-11-04
  • 2021-12-13
  • 2021-12-18
相关资源
相似解决方案