1.sys模块
功能:该模块提供了一些接口,用于访问 Python 解释器自身使用和维护的变量,同时模块中还提供了一部分函数,可以与解释器进行比较深度的交互
sys模块是Python的内建模块,只需要使用import语句导入即可: import sys
如果想要调用sys模块属性,只需要在sys模块方法前添加sys前缀就可以调用指定方法:sys.name
2.常用属性功能
- sys.argv() --接受外部传递的参数
- sys.path() --返回当前Python的环境路径(当前Py环境可以导入内置,第三方包与函数的所在路径)
- sys.module --将Python启动时加载的模块集合起来并返回一个列表
- sys.exit() --退出程序
- sys.version() --获取当前Python的版本
- sys.platform() --获取当前系统平台
- sys.getdefaultencoding() --获取当前系统级别默认的编码格式
- sys.setdefaultencoding() --设置当前系统级别默认的编码格式
- sys.getfilesystemencoding() --获取文件系统使用的编码格式
- sys.stdin() --I/O的标准输入
- sys.stdout() --I/O的标准输出
- sys.stderr() --解释器自己的提示和错误消息计入stderr,即标准化错误
- - 终端提示符修改
- sys.ps1 --一级提示符
- sys.ps2 --二级提示符
3.属性使用方法
3.1.sys.argv
"argv"
即"argument value"
的简写,是一个列表对象,其中存储的是在命令行代用Python脚本
时提供的“命令行参数”
这在需要在命令行接受用户输入时非常有用
创建一个sys_argv.py文件,输入一下内容
import sys
sys_data = sys.argv
print(sys_data)
# 打印结果:['sys_argv.py']
注意:外部传入的参数会被放入一个列表中,这个列表的
0
元素是程序本身名称,外部参数从索引1
开始
sys.argv[0] => ‘程序脚本本身名称’ = 文件名
sys.argv[1[,…]] =>命令行参数
示例
# 在终端命令行输入:
python sys_argv.pye argv1 argv2
# 输入结果:['sys_argv.py', 'argv1', 'argv2']
['argv1', 'argv2'] 就是sys.argv 接受的外部命令行参数
应用示例:练习新手入门的登录验证
import sys
# 创建需要验证的用户名和密码
name = 'sys'
password = '123'
# 然后做判断argv的参数长度是为3,因为加上文件名、用户名和密码总长度就是3,所以在这里做判断长度的操作
if len(sys.argv) == 3:
# 判断成功后,再往下走
# 将用户名和密码单独保存一个变量
user = sys.argv[1]
pwd = sys.argv[2]
# 判断用户名和密码是否一致
if name == user and password == pwd:
# 用户名和密码一致,这打印以下内容
print("验证通过,登录成功!")
# 当长度判断或验证没通过,则执行下方代码
else:
print("验证失败,请重新输入用户名和密码!")
user = input("请输入用户名: ")
pwd = input("请输入密码")
# 最后在执行一次验证判断
if name == user and password == pwd:
print("验证通过")
# 以上代码仅只有一只验证失败重新输入的机会
# 想保持无线重新输入或有次数的输入可以添加 while 循环或 for 循环
3.2.sys.path (导入模块及包的查找路径)
功能:该属性是一个由字符串组成的列表,其中各个元素表示的是 Python 搜索模块的路径;在程序启动期间被初始化。
其中第一个元素(也就是path[0])的值是最初调用 Python 解释器的脚本所在的绝对路径;如果是在交互式环境下查看sys.path的值,就会得到一个空字符串。
可以通过Python解释来控制搜索模块的顺序
import sys
path = sys.path
print(path)
# 输出结果:
['/root/Python', '/usr/lib/python39.zip', '/usr/lib/python3.9', '/usr/lib/python3.9/lib-dynload', '/usr/local/lib/python3.9/dist-packages', '/usr/lib/python3/dist-packages']
# 也可以通过索引下标来获取路径
print(path[0])
# 输出结果: /root/Python
#临时指定新的搜索路径
path sys.path[0]='d:\test'
print(path)
#显示临时指定路径已经存在
['d:\test', 'G:\\Python\\Lib\\idlelib', 'G:\\Python\\python36.zip', 'G:\\Python\\DLLs', 'G:\\Python\\lib', 'G:\\Python', 'G:\\Python\\lib\\site-packages']
# 添加路径
sys.path.append("F:\Pycharm File\PycharmProjects\python\day10")
print(sys.path[-1])
# F:\Pycharm File\PycharmProjects\python\day10
3.3.sys.module
功能:返回系统导入的模块信息
该属性是一个字典,包含的是各种已加载的模块的模块名到模块具体位置映射
通过手动修改这个字典,可以重新加载某些模块
import sys
module = sys.module
print(module)
# 输出结果:
"""
{'sys': <module 'sys' (built-in)>, 'builtins': <module 'builtins' (built-in)>, '_frozen_importlib': <module '_frozen_importlib' (frozen)>, '_imp': <module '_imp' (built-in)>, '_thread': <module '_thread' (built-in)>, '_warnings': <module '_warnings' (built-in)>...}
"""
# 可以通过module的key来获取模块命
module_keys = sys.modules.keys()
print(module_kyes)
"""
输出结果:
dict_keys(['sys', 'builtins', '_frozen_importlib', '_imp', '_thread', '_warnings', '_weakref', '_io', 'marshal', 'posix', '_frozen_importlib_external', 'time', 'zipimport', '_codecs', 'codecs', 'encodings.aliases', 'encodings', 'encodings.utf_8', '_signal', 'encodings.latin_1', '_abc', 'abc', 'io', '__main__', '_stat', 'stat', '_collections_abc', 'genericpath', 'posixpath', 'os.path', 'os', '_sitebuiltins', 'sitecustomize', 'site'])
"""
示例:判断模块是否导入
import sys
if 'math' in sys.modules:
print("模块已导入!")
else:
print("模块为导入!")
3.4.sys.exit()
sys.exit(“指定退出打印信息”)
功能:用于退出程序,可以指定退出时的状态码
在程序执行过程中发现错误或满足某些条件时需要终止程序时非常有用
示例:模拟程序故障时自动退出
def main():
# 模拟程序执行中的条件
error_condition = True
if error_condition:
print("发生错误,程序崩溃退出!")
sys.exit("Error_condition(500)")
else:
print("程序正常执行!")
main()
# 输出结果
发生错误,程序崩溃退出!
Error_condition(500)
3.5.sys.version
获取当前Python的版本
import sys
version = sys.version
print(version)
# 输出结果
3.9.16 (main, Dec 7 2022, 01:11:51)
[GCC 9.4.0]
3.6.sys.platform
获取当前系统平台
import sys
platform = sys.platform
print(platform)
# 输出结果
linux
3.7.sys.stdin sys.stdout sys.stderr
sys.stdin:用于交互输入(包括input()的调用),即标准化输入
sys.stdout用于print()和表达式语句的输出以及input()的提示,即标准化输出
sys.stderr 标准化错误信息
sys.stdin示例:
import
name = sys.stdin.readlien()
print(name)
输出结果
~/Python python sys_std.py
sys_stdin=input <= 终端输入的参数
sys_stdin=input <= python打印的结果
sys.stdout示例:
import sys
name = sys.stdin.readline()
sys.stdout.write(f"终端输入的数据:{name}")
输出结果
~/Python python sys_std.py
sys_stdin=input <= stdin的操作 => input
终端输入的数据:sys_stdin=input <= stdout的操作 => print
示例:模拟简单进度条动态打印
for i in range(101):
sys.stdout.write("█")
tiem.sleep(0.1)
sys.stdout.flush() # 刷新显示到屏幕上
# 输出结果:
~/Python python sys_stdout.py
████████████████████████████████████████
示例:模拟进度条打印
# 模拟进度条效果,宽度是50,传入的是“#”
print('|%-50s|' % ('#')) # 一个等于 2%
print('|%-50s|' % ('########'))
# '%-50s' - 表示参数向左对齐,正数参数向右对齐 50 表示的是宽度
# 输出结果:
~/Python python sys_stdout.py
|# |
|######## |
# 模拟进度百分比效果
# 模拟进度百分比效果
print('%d%%' % (10))
print('%d%%' % (20))
# '%d%%' %d表示传入整数, %% 第二个%表示去掉前面%的特殊意义
# 输出结果
~/Python python sys_stdout.py
10%
20%
# 通过修改宽度参数来调整进度条宽度
width = 50
print(('|%%-%ds|' % (width)) % ("#"))
# 解析:
"""
('|%%-%ds|' % (width)) % ("#")
# 第一层
'|%%-%ds|' % (width) = 第一传入的参数是 (width = 50) = '|%%-%ds|' % (50) = 打印结果:|%-50s|
# 第二层
('|%-50s|') % ("#") = 打印结果:|# |
"""
# 模拟百分比进度条打印
import sys
import time
# 构建一个耗时计算函数装饰器,来统计函数执行总耗时
def times(_func):
def f(*args, **kwargs):
start_time = time.time()
ret = _func()
end_time = time.time()
count_time = end_time-start_time
print(" 耗时:%.2fs" % count_time)
return ret
return f
def progress(percent, symbole='#', width=50):
if percent > 1: # 超过100%的时候让其停在1
percent = 1 # 可以避免进度条溢出
show_progress = ('|%%-%ds|' % width) % (int(percent * width) * symbole)
sys.stdout.write("\r%s %.2f%%" % (show_progress, percent * 100))
sys.stdout.flush() # 刷新显示到屏幕上
# '\r' 表示让光标跳到行首
@times
def plan():
data_size = 1050 # 给定数据大小
recv_szie = 0 # 传输初始值为0
while recv_szie <= data_size:
time.sleep(1) # 模拟数据延迟
recv_szie += 100 # 每次传输 100
percent = recv_szie / data_size # 接受的比例
progress(percent)
plan()
# 输出结果:
|##################################################| 100.00% 耗时:11.10s