1-Python - sys
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