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.platformLinux平台的返回,在Python 3.3版本之后统一返回linux,而之前的Python版本中,则根据Linux的主要版本不同,会返回linux2linux3

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
posted @ 2020-12-02 09:37  听雨危楼  阅读(185)  评论(0编辑  收藏  举报