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