sys模块提供了一系列有关Python运行环境的变量和函数
sys.path:path是一个目录列表,供Python从中查找第三方扩展模块。在python启动时,sys.path
根据内建规则、PYTHONPATH变量进行初始化。
>>>sys.path ['', 'E:\Python27\Lib\idlelib', 'C:\Windows\system32\python27.zip', 'E:\Python27\DLLs', 'E:\Python27\lib', 'E:\Python27\lib\plat-win', 'E:\Python27\lib\lib-tk', 'E:\Python27', 'E:\Python27\lib\site-packages']
有时候为了让python能够找到我们自己定义的模块,需要修改sys.path
的内容,比如:
sys.path.append(“ path”)
处理模块
path 列表是一个由目录名构成的列表, Python 从中查找扩展模块( Python 源模块, 编译模块,或者二进制扩展).
启动 Python 时,这个列表从根据内建规则, PYTHONPATH 环境变量的内容, 以及注册表( Windows 系统)等进行初始化.
使用sys模块查找内建模块
builtin_module_names 列表包含 Python 解释器中所有内建模块的名称:
print(sys.builtin_module_names ) ('_ast', '_bisect', '_codecs', '_codecs_cn', '_codecs_hk', '_codecs_iso2022', '_codecs_jp', '_codecs_kr', '_codecs_tw', '_collections', '_csv', '_datetime', '_functools', '_heapq', '_imp', '_io', '_json', '_locale', '_lsprof', '_md5', '_multibytecodec', '_opcode', '_operator', '_pickle', '_random', '_sha1', '_sha256', '_sha512', '_signal', '_sre', '_stat', '_string', '_struct', '_symtable', '_thread', '_tracemalloc', '_warnings', '_weakref', '_winapi', 'array', 'atexit', 'audioop', 'binascii', 'builtins', 'cmath', 'errno', 'faulthandler', 'gc', 'itertools', 'marshal', 'math', 'mmap', 'msvcrt', 'nt', 'parser', 'sys', 'time', 'winreg', 'xxsubtype', 'zipimport', 'zlib')
使用sys模块查找已导入的模块
modules 字典包含所有加载的模块. import 语句在从磁盘导入内容之前会先检查这个字典.
首先modules字典:
print(sys.modules) {'os': <module 'os' from 'C:\Program Files\Anaconda3\lib\os.py'>, '_locale': <module '_locale' (built-in)>, 'encodings.gbk': <module 'encodings.gbk' from 'C:\Program Files\Anaconda3\lib\encodings\gbk.py'>, '_codecs_cn': <module '_codecs_cn' (built-in)>, '_bootlocale': <module '_bootlocale' from 'C:\Program Files\Anaconda3\lib\_bootlocale.py'>, '_io': <module 'io' (built-in)>, 'io': <module 'io' from 'C:\Program Files\Anaconda3\lib\io.py'>, 'genericpath': <module 'genericpath' from 'C:\Program Files\Anaconda3\lib\genericpath.py'>, '_stat': <module '_stat' (built-in)>, '_frozen_importlib_external': <module '_frozen_importlib_external' (frozen)>, 'encodings.mbcs': <module 'encodings.mbcs' from 'C:\Program Files\Anaconda3\lib\encodings\mbcs.py'>, '__main__': <module '__main__' from 'F:/untitled2/练习2/测试/text.py'>, 'encodings': <module 'encodings' from 'C:\Program Files\Anaconda3\lib\encodings\__init__.py'>, '_sitebuiltins': <module '_sitebuiltins' from 'C:\Program Files\Anaconda3\lib\_sitebuiltins.py'>, 'encodings.utf_8': <module 'encodings.utf_8' from 'C:\Program Files\Anaconda3\lib\encodings\utf_8.py'>, 'encodings.aliases': <module 'encodings.aliases' from 'C:\Program Files\Anaconda3\lib\encodings\aliases.py'>, '_codecs': <module '_codecs' (built-in)>, '_signal': <module '_signal' (built-in)>, '_weakrefset': <module '_weakrefset' from 'C:\Program Files\Anaconda3\lib\_weakrefset.py'>, 'sysconfig': <module 'sysconfig' from 'C:\Program Files\Anaconda3\lib\sysconfig.py'>, 'abc': <module 'abc' from 'C:\Program Files\Anaconda3\lib\abc.py'>, 'os.path': <module 'ntpath' from 'C:\Program Files\Anaconda3\lib\ntpath.py'>, '_weakref': <module '_weakref' (built-in)>, '_warnings': <module '_warnings' (built-in)>, 'marshal': <module 'marshal' (built-in)>, 'winreg': <module 'winreg' (built-in)>, 'encodings.latin_1': <module 'encodings.latin_1' from 'C:\Program Files\Anaconda3\lib\encodings\latin_1.py'>, 'nt': <module 'nt' (built-in)>, 'ntpath': <module 'ntpath' from 'C:\Program Files\Anaconda3\lib\ntpath.py'>, 'sys': <module 'sys' (built-in)>, '_thread': <module '_thread' (built-in)>, 'site': <module 'site' from 'C:\Program Files\Anaconda3\lib\site.py'>, 'encodings.cp437': <module 'encodings.cp437' from 'C:\Program Files\Anaconda3\lib\encodings\cp437.py'>, 'zipimport': <module 'zipimport' (built-in)>, '_multibytecodec': <module '_multibytecodec' (built-in)>, 'codecs': <module 'codecs' from 'C:\Program Files\Anaconda3\lib\codecs.py'>, '_frozen_importlib': <module '_frozen_importlib' (frozen)>, 'builtins': <module 'builtins' (built-in)>, 'stat': <module 'stat' from 'C:\Program Files\Anaconda3\lib\stat.py'>, 'errno': <module 'errno' (built-in)>, '_collections_abc': <module '_collections_abc' from 'C:\Program Files\Anaconda3\lib\_collections_abc.py'>, '_imp': <module '_imp' (built-in)>}
查找是用字典查找的末模式:
print (sys.modules.keys()) ['os.path', 'os', 'exceptions', '_ _main_ _', 'ntpath', 'strop', 'nt', 'sys', '_ _builtin_ _', 'site', 'signal', 'UserDict', 'string', 'stat']
使用sys重定向输出:
print 'Dive in' # 标准输出 saveout = sys.stdout # 终在重定向前保存stdout,这样的话之后你还可以将其设回正常 fsock = open('out.log', 'w') # 打开一个新文件用于写入。如果文件不存在,将会被创建。如果文件存在,将被覆盖。 sys.stdout = fsock # 所有后续的输出都会被重定向到刚才打开的新文件上。 print 'This message will be logged instead of displayed' # 这样只会将输出结果“打印”到日志文件中;屏幕上不会看到输出 sys.stdout = saveout # 在我们将 stdout 搞乱之前,让我们把它设回原来的方式。 fsock.close() # 关闭日志文件。
使用sys模块退出程序:
import sys
sys.exit(1)
注意 sys.exit 并不是立即退出. 而是引发一个 SystemExit 异常. 这意味着你可以在主程序中捕获对 sys.exit 的调用
$捕获sys.exit调用
import sys print "hello" try: sys.exit(1) except SystemExit: # 捕获退出的异常 pass # 捕获后不做任何操作 print "there" hello there
重要作用:如果准备在退出前自己清理一些东西(比如删除临时文件), 你可以配置一个 "退出处理函数"(exit handler), 它将在程序退出的时候自动被调用