系统操作模块(系统内置)-sys模块介绍
文章目录
一、模块介绍
1.1、模块作用
Python的sys模块负责导出与Python解释器本身相关的组件(如模块搜索路径),提供访问由解释器使用或维护的变量的接口,并提供了一些函数用来和解释器进行交互,操控Python的运行时环境。
1.2、模块安装与导入
系统内置,直接导入
import sys
二、模块属性和方法介绍
下面就来详细介绍下该模块中常用的属性和方法。
1.1、模块属性和方法列举
类别 | 模块方法与变量 | 作用 | 备注 |
---|---|---|---|
解释器平台环境 | sys.platform | 返回解释器程序所在平台标识符字符串 | 常用-静态对象 |
sys.prefix | 返回安装平台无关Python文件的目录 | 静态对象 | |
sys.executable | Python解释器可执行文件的绝对路径 | 静态对象 | |
解释器版本相关 | sys.version | 获取Python解释程序的版本信息 | 常用-静态对象 |
sys.version_info | 当前解释器版本的命名元组 | 静态对象 | |
sys.api_version | 返回表示Python解释器的C语言版本API的整数 | 静态对象 | |
sys.hexversion | 对sys.version_info中包含的版本信息进行编码后使用十六进制表示的整数 | 静态对象 | |
sys.copyright | 包含解释器版权相关信息的字符串 | 静态对象 | |
解释器库与模块相关 | sys.exec_prefix | 用于查找特定于当前机器的python库的路径前缀 | |
sys.path | 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值 | ||
sys.modules | 已加载模块表 | ||
sys.builtin_module_names | 当前解释器所有内置模块的名称 | ||
解释器与执行文件相关 | sys.argv | 命令行参数List,第一个元素是程序本身路径 | |
sys.exit(n) | 退出程序,正常退出时exit(0) | ||
解释器数据结构相关 | sys.maxint | 获取支持的最大的Int值 | |
sys.maxsize | 返回字符串、列表、字典和其他内置类型的最大长度 | ||
sys.maxunicode | 返回能够表示的最大Unicode码点的整数值 | ||
sys.implementation | 包含有关Python实现的相关信息 | ||
sys.int_info | 包含有关整形实现的信息的结构序列 | ||
sys.float_info | 包含有关浮点数实现的信息的结构序列 | ||
sys.thread_info | 包含有关线程实现的信息的结构序列 | ||
sys.hash_info | 包含哈希算法相关信息的结构序列 | ||
sys.byteorder | 本机的字节排序方式,little表示小尾,big表示大尾 | ||
sys.float_repr_style | 表示浮点数的repr()方法的输出样式的字符串 | ||
标准流相关 | sys.stdout | 输出 | |
sys.stdin | 输入 | ||
sys.stderror | 错误输出 | ||
递归相关 | sys.getrecursionlimit() | #获取最大递归层数 | |
sys.setrecursionlimit(1200) | #设置最大递归层数 | ||
编码相关 | sys.getdefaultencoding() | #获取解释器默认编码 | |
sys.getfilesystemencoding | #获取内存数据存到文件里的默认编码 | ||
异常处理相关 | sys.exc_info() | 获取正在处理的异常的相关信息 | |
sys.last_type | 返回最近一次捕获的异常的类型(只在交互式环境下可用 ) | ||
sys.last_value | 返回最近一次捕获的异常的值(只在交互式环境下可用) | ||
sys.last_traceback | 返回最近一次捕获的异常的追踪信息(只在交互式环境下可用) | ||
1.2、模块属性和方法具体示例与说明-常用
sys.platform
代码示例
>>> sys.platform
'darwin'
说明
对除了linux的Unix系统, 是uname -s 的返回值和uname -r 版本合并的小写形式,例如linux2指的是使用2.x.x版本的linux系统。由于包含了系统版本,故推荐的使用方法是借助startwith 函数。
if sys.platform.startwith('linux')
# linux 代码
pass
elif sys.platform.startwith('freebsd')
# freebsd 代码
pass
返回值参考下
系统 | platform值 |
---|---|
window | ’win32‘ |
linux | ’linux‘ |
Windows/Cygwin | ‘cygwin’ |
Mac OS X | ‘darwin’ |
sys.version
代码示例
>>> sys.version
'3.7.2 (default, Feb 12 2019, 08:15:36) \n[Clang 10.0.0 (clang-1000.11.45.5)]'
说明
sys.path
sys.path是一个由目录名称字符串组成的列表,每个目录名称字符串代表正在运行的Python解释器的真正的搜索路径。该列表在解释器启动时根据PYTHONPATH设置进行初始化。
代码示例
>>> sys.path
['', '/Users/huangdongdong/.local/share/virtualenvs/My_Python-trbyZ-cn/lib/python37.zip', '/Users/huangdongdong/.local/share/virtualenvs/My_Python-trbyZ-cn/lib/python3.7', '/Users/huangdongdong/.local/share/virtualenvs/My_Python-trbyZ-cn/lib/python3.7/lib-dynload', '/usr/local/Cellar/python/3.7.2_2/Frameworks/Python.framework/Versions/3.7/lib/python3.7', '/Users/huangdongdong/.local/share/virtualenvs/My_Python-trbyZ-cn/lib/python3.7/site-packages']
说明
注意:sys.path[0] 表示当前脚本所在目录。在交互模式下,sys.path[0] 返回空字符串。
sys.modules
sys.modules是一个字典,你的Python会话或程序(准确的说是Python进程)所导入的每个模块在其中都一个name:module项:
代码示例
>>> sys.modules
{'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)>,…}
说明
可以像一般的字典一样进行各种字典操作。
sys.exc_info()
获取正在处理的异常的相关信息,返回值为一个包含异常类、异常实例和异常回溯信息的元组。
代码示例
>>> import sys
>>> s = 'abc'
... try:
... int(s)
... except ValueError:
... e = sys.exc_info()
>>> type(e)
<class 'tuple'>
>>> exc_type, exc_value, exc_traceback = e
>>> exc_type
<class 'ValueError'>
>>> exc_value
ValueError("invalid literal for int() with base 10: 'abc'")
>>> exc_value.args[0]
"invalid literal for int() with base 10: 'abc'"
>>> exc_traceback
<traceback object at 0x103a4d948>
>>> dir(exc_traceback)
['tb_frame', 'tb_lasti', 'tb_lineno', 'tb_next']
>>> exc_traceback.tb_frame
<frame at 0x103bf4a98, file '<stdin>', line 4, code <module>>
>>> exc_traceback.tb_lasti
6
>>> exc_traceback.tb_lineno
2
>>> exc_traceback.tb_next
>>>
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'argv' is not defined
>>> sys.last_type
<class 'NameError'>
>>> sys.last_value
NameError("name 'argv' is not defined")
>>> sys.last_traceback
<traceback object at 0x103d38248>
说明
sys.argv
sys.argv 传递给程序的命令行参数列表;其中,sys.argv[0]表示脚本名称,各个参数均为字符串类型。
代码示例
写一个脚本,内容如下
import sys
# filename:argv_test.py
for i in range(len(sys.argv)):
print('argv{0}: type is {1}, value is {2}'.format(i, type(sys.argv[i]), sys.argv[i]))
在命令行下运行该脚本,并提供几个参数
python argv_test.py 1 a 2 b 3 c`
输出为:
argv0: type is <class 'str'>, value is argv_test.py
argv1: type is <class 'str'>, value is 1
argv2: type is <class 'str'>, value is a
argv3: type is <class 'str'>, value is 2
argv4: type is <class 'str'>, value is b
argv5: type is <class 'str'>, value is 3
argv6: type is <class 'str'>, value is c
说明
无
sys.exit(n)
sys.exit(n) 通过引发SystemExit异常来退出当前程序,n是一个表示状态码的整数退出码。0值表示正常(默认值),非零值表示异常。如果n指定为一个非整数值,则将它打印到sys.stderr并使用退出码1退出。
代码示例
>>> sys.exit(0) # 执行后将退出交互模式
$ echo $? # 查看退出状态码
0
$ python # 重新进入python的交互模式
Python 3.7.0 (default, Jun 29 2018, 20:13:13)
[Clang 9.1.0 (clang-902.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.exit(3)
$ echo $? # 查看退出状态码
3
$ python # 重新进入python的交互模式
Python 3.7.0 (default, Jun 29 2018, 20:13:13)
[Clang 9.1.0 (clang-902.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.exit(0.5)
0.5
$ echo $? # 查看退出状态码
1
说明
sys.stdout.write(str)
sys.stdout.write和print 都是输出相关的函数print内部也是调用的sys.stdout,sys.stdout默认输出是屏幕。
代码示例
import sys
s = 'test stdout'
print('--')
sys.stdout.write(s)
print('--')
class A(object):
pass
print(A)
sys.stdout.write(A)
说明
print 什么类型都可以输出,但是sys.stdout.write只可以输出字符串类型,否则报错。print默认是最后换行,但是sys.stdout.write默认不换行。
下面看我在百度找到的别人大佬写的一段代码:
import sys
file = sys.stdout # 存储原始的输出对象
sys.stdout = open('1.txt', 'w') # 重定向所有的写入内容到 1.txt 文件,
print('Citizen_Wang') # 写入到 1.txt 文件中,在上一行语句中改变了输出流到文件中
print('Always fall in love with neighbours') # 继续写入到文件中
sys.stdout.close() # 其实就是 open 文件之后的关闭
sys.stdout = file # 将 print 命令的结果返回给控制台
print('输出信息返回在控制台') # 该信息会在控制台也显示
补充应用
基于sys.stdout.flush()和sys.stdout.write()实现进度条效果
import sys
import time
print("downloading:")
def view_bar(num, total):
rate = float(num) / float(total)
rate_num = int(rate * 100)
r = "\r"+("="*(2*rate_num//10)+">")+(" "*(20-2*rate_num//10))+'%d%%' % (rate_num, )
sys.stdout.write(r)
sys.stdout.flush() # 刷新缓冲区
if __name__ == '__main__':
for i in range(0, 101):
time.sleep(0.01)
view_bar(i, 100)
print("\ndownload successful\n")