about
sys模块维护着Python解释器内的一些变量或者与解释器交互的函数。如Python解释器的版本信息,系统平台相关的信息等等。
下表展示了sys的一些常用的方法或者属性:
| 方法 | 描述 |
|---|---|
| sys.argv | 获取Python的命令行参数 |
| sys.version | 获取Python解释器的版本信息 |
| sys.platform | 获取平台信息,不同平台返回的结果不同 |
| sys.modules | 维护Python运行中所有的模块 |
| sys.getdefaultencoding() | 返回解释器当前的默认字符编码 |
| sys.stdin | 标准输入 |
| sys.stdout | 标准输出 |
| sys.stderr | 错误输出 |
| sys.getrecursionlimit() | 返回递归限制的当前值 |
| sys.setrecursionlimit() | 设置递归的最大深度 |
| sys.exit(n) | 引发SystemExit异常来实现退出Python |
| sys.path | 维护Python搜索模块的路径 |
常用方法
来些示例看看:
import sys
print(sys.argv)
"""
D:\tmp\module>python test.py 127.0.0.1 8000
['test.py', '127.0.0.1', '8000']
"""通过上例可以看到,sys.argv以列表的方式返回解释器执行脚本时的参数,列表的索引0的位置固定的是脚本名称,后面跟的参数被列表依次接收。
import sys
print(sys.version)
print(sys.platform)
"""
3.6.6 (v3.6.6:4cf1f54eb7, Jun 27 2018, 03:37:03) [MSC v.1900 64 bit (AMD64)]
win32
"""如上例,sys.version返回Python解释器的版本号,而sys.platform则返回系统平台信息。
不同的平台,返回的结果亦不相同:
| System | platform value |
|---|---|
| Linux | linux |
| Windows | win32 |
| Windows/Cygwin | cygwin |
| Mac OS X | darwin |
关于sys.platform的Linux平台的返回,在Python 3.3版本之后统一返回linux,而之前的Python版本中,则根据Linux的主要版本不同,会返回linux2和linux3。
sys.modules以字典的形式维护着Python解释器从运行开始,其所有的模块伴随着Python解释器的运行,直至结束:
import sys
print(sys.modules.keys())
"""
dict_keys([
'builtins', 'sys', '_frozen_importlib', '_imp', '_warnings', '_thread',
'_weakref', '_frozen_importlib_external', '_io', 'marshal', 'nt', 'winreg',
'zipimport', 'encodings', 'codecs', '_codecs', 'encodings.aliases',
'encodings.utf_8', '_signal', '__main__', 'encodings.latin_1', 'io',
'abc', '_weakrefset', 'site', 'os', 'errno', 'stat', '_stat', 'ntpath',
'genericpath', 'os.path', '_collections_abc', '_sitebuiltins', 'sysconfig',
'_bootlocale', '_locale', 'encodings.gbk', '_codecs_cn', '_multibytecodec',
'types', 'functools', '_functools', 'collections', 'operator', '_operator',
'keyword', 'heapq', '_heapq', 'itertools', 'reprlib', '_collections',
'weakref', 'collections.abc', 'importlib', 'importlib._bootstrap',
'importlib._bootstrap_external', 'warnings', 'importlib.util', 'importlib.abc',
'importlib.machinery', 'contextlib', 'google', 'metapensiero', 'pywin32_bootstrap',
'sockjs', 'zope', 'sitecustomize'
])
"""上例中,通过取字典的keys,来获取sys.modules中维护的所有的模块名。而每个key对应的value则是该模块所在路径。
当程序在执行中,有导入模块的操作时,就会对这个字典做插入操作,当重复导入模块时,Python会先判断该字典中是否已经存在,存在则无需导入。这也解答了前文所说的,模块导入只发生一次。而在使用某个模块时,Python解释器会去这个字典内查询该模块是否存在,存在则直接使用,不存在则报错。
import sys
print(sys.getdefaultencoding()) # utf-8如上例,sys.getdefaultencoding获取当前解释器的默认字符编码。在Python 3.2版本之前,对应的有sys.setdefaultencoding方法,手动设置当前解释器的默认字符编码,但该方法在Python 3.2版本开始被弃用了。
sys.stdin、 sys.stdout、sys.stderr,解释器用于标准输入、输出和错误的信息。
stdin用于所有交互时输入(如调用input())。
stdout用于输出print()和表达式语句。
解释器的提示信息及错误信息则转到stderr。
之前在学习递归的时候说过,递归需要很大的开销,不能无限地递归下去,或者死递归,这样会导致堆栈的溢出从而引发Python崩溃。而Python为了防范出现这种情况,默认递归的最大深度是1000:
import sys
print(sys.getrecursionlimit()) # 1000
sys.setrecursionlimit(1110)
print(sys.getrecursionlimit()) # 1110
sys.setrecursionlimit(1) # RecursionError: cannot set the recursion limit to 1 at the recursion depth 1: the limit is too low如上例,sys.getrecursionlimit返回递归的最大深度(具体的返回值根据实际系统环境的不同则稍有变动)。而sys.setrecursionlimit则是设置解释器的最大递归深度。该设置是临时的。
需要说明的是,如果有需求需要设置更大的递归深度,则要谨慎操作,要考虑到可能出现的堆栈溢出引出的Python崩溃。而另一种情况则是如果手动设置的递归深度过小时,则会抛出RecursionError异常。
sys.exit(n)则是退出Python程序,sys.exit是通过引发SystemExit异常来实现的。可选参数n是整数,一般地,退出状态是0(默认)则认为是"成功终止",其他的非零值则视为"异常终止"。
that's all