目录
一、系统模块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 > <stdin> 0 1 True True > a > > <stdin> 0 2 False True > ab > > <stdin> 0 3 False True > abc > > <stdin> 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)
- 效果
回到总目录