前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python sys模块的使用

Python sys模块的使用

作者头像
Python碎片公众号
发布2021-02-26 15:18:15
1.4K0
发布2021-02-26 15:18:15
举报
文章被收录于专栏:Python碎片公众号的专栏

sys模块是Python中的标准库,是与Python的解释器交互的库,可以通过sys来获取Python解释器的信息。

os模块是与操作系统交互的,对应的是操作系统,sys是与Python解释器交互的,对应的是Python的运行环境。

一、sys模块返回当前解释器版本

代码语言:javascript
复制
# coding=utf-8
import sys
 
 
print(sys.version)
print(sys.version_info)

Python3:

代码语言:javascript
复制
3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) 
[MSC v.1916 64 bit (AMD64)]
sys.version_info(major=3, minor=7, micro=3, releaselevel='final', serial=0)

Python2:

代码语言:javascript
复制
2.7.5 (default, Nov  6 2016, 00:28:07) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]
sys.version_info(major=2, minor=7, micro=5, releaselevel='final', serial=0)

sys.version 和 sys.version_info 都可以返回当前的Python解释器的版本信息。如果,同一个脚本要在 Python2 和 Python3 中都能运行,但是 Python2 和 Python3 实现的代码不同,可以获取解释器版本,通过判断解释器版本来执行不同代码。

sys.version 返回的是一个三段式的版本号(主版本号.子版本号.阶段版本号),这个版本号可以与数字比较大小(判断版本时使用)。

sys.version_info 返回的是一个版本信息的元组,可以使用其中的 major 值来判断解释器版本。

在 windows 中还可以使用 sys.winver 来获取Python解释器的主版本和子版本。

二、sys模块获取当前解释器的编码方式

代码语言:javascript
复制
print(sys.getdefaultencoding())
print(sys.getfilesystemencoding())
print(sys.platform)

Python3:

代码语言:javascript
复制
utf-8
utf-8
win32

Python2:

代码语言:javascript
复制
ascii
mbcs
win32

sys.getdefaultencoding() 返回当前解释器的编码方式,在 Python3 中,默认的编码方式是 utf-8 。在 Python2 中,默认的编码方式是 ascii ,可以使用如下代码将编码方式设置为 utf-8 。

代码语言:javascript
复制
reload(sys)
sys.setdefaultencoding('utf-8')

sys.getfilesystemencoding() 返回当前解释器中写文件使用的编码方式。在 Python3 中默认的是 utf-8。在 Python2 中,默认的编码方式是 mbcs 。MBCS(Multi-Byte Chactacter System,即多字节字符系统)是一种编码类型。

sys.platform 返回当前操作系统的名称。

三、sys.path返回导包的顺序

代码语言:javascript
复制
print(sys.path)

windows:

代码语言:javascript
复制
['C:\\Users\\python\\Desktop\\python_demo\\os_test', 
'C:\\Users\\python\\Desktop\\python_demo', 
'C:\\Users\\python\\Desktop\\python_demo\\call_back', 
'C:\\Program Files\\JetBrains\\PyCharm 2019.1.1\\helpers\\pycharm_display', 
'C:\\Program Files\\Python37\\python37.zip', 
'C:\\Program Files\\Python37\\DLLs', 
'C:\\Program Files\\Python37\\lib', 
'C:\\Program Files\\Python37', 
'C:\\Users\\python\\AppData\\Roaming\\Python\\Python37\\site-packages', 
'C:\\Program Files\\Python37\\lib\\site-packages', 
'C:\\Program Files\\JetBrains\\PyCharm 2019.1.1\\helpers\\pycharm_matplotlib_backend']

Redhat:

代码语言:javascript
复制
['/root/python_demo/os_test', 
'/usr/lib64/python27.zip', 
'/usr/lib64/python2.7', 
'/usr/lib64/python2.7/plat-linux2', 
'/usr/lib64/python2.7/lib-tk', 
'/usr/lib64/python2.7/lib-old', 
'/usr/lib64/python2.7/lib-dynload', 
'/usr/lib64/python2.7/site-packages', 
'/usr/lib/python2.7/site-packages', 
'/usr/lib/python2.7/site-packages/cloud_init-0.7.6-py2.7.egg']

sys.path 返回的是Python导包顺序的列表,使用 import ... , from ... import ... 等方式导包时,会按此顺序到这些目录下寻找要导入的模块,如果找到了就不会继续往下。

导包的顺序是由近及远的,会优先在当前目录下导。

很多人会犯一个错,自己代码的文件名与模块的名字一样,导致导包出错,因为导包时,按照 sys.path 的顺序,导入的其实是本地自己创建的文件,而不是需要导入的模块,所以代码运行时报错。

四、sys返回当前环境中导入的包

代码语言:javascript
复制
print(sys.modules.keys())

运行结果:

代码语言:javascript
复制
['copy_reg', 'sre_compile', 'locale', '_sre', 'functools',
 'encodings', 'site', '__builtin__', 'sysconfig', 'operator', 
'__main__', 'types', 'encodings.encodings', 'encodings.gbk', 
'abc', '_weakrefset', 'encodings._codecs_cn', 'errno', 
'encodings.codecs', 'sre_constants', 're', '_abcoll', 'ntpath', 
'_codecs', 'encodings._multibytecodec', 'nt', '_warnings', 
'genericpath', 'stat', 'zipimport', 'encodings.__builtin__', 
'warnings', 'UserDict', '_multibytecodec', 'sys', 'codecs', 
'os.path', '_functools', '_codecs_cn', '_locale', 
'sitecustomize', 'signal', 'traceback', 'linecache', 
'encodings.aliases', 'exceptions', 'sre_parse', 'os', '_weakref']

sys.modules 返回当前解释器中,模块名和导入的模块对应关系的字典,使用 modules.keys() 方法获取到导入的所有模块名列表。

启动 Python 时,这些模块就被加载到了内存中,如果代码中第一次导入一个模块,解释器会将此模块加入到 modules 中。当第二次导入模块时,Python 解释器会直接到 modules 字典中查找。

五、sys.argv获取命令行的参数

代码语言:javascript
复制
print(sys.argv[0])
print(sys.argv)

(PyCharm)直接运行:

代码语言:javascript
复制
C:/Users/python/Desktop/python_demo/os_test/sys_demo.py
['C:/Users/python/Desktop/python_demo/os_test/sys_demo.py']

直接运行后,sys.argv 会返回当前文件的绝对路径,返回结果是一个列表。

传入参数运行:

代码语言:javascript
复制
$ python sys_demo.py one tow three hello python
sys_demo.py
['sys_demo.py', 'one', 'tow', 'three', 'hello', 'python']

在命令行运行,后面依次跟传入 Python 脚本的参数,用空格隔开。sys.agrv 会获取脚本的文件名和后面传入的所有参数,返回结果是一个列表,列表中的参数顺序与传入的顺序一致。所以,列表的第一个元素一定是文件名。

利用 sys.argv ,可以实现类似 Linux 命令使用方式的脚本,把复杂的功能封装到脚本中,使用时在脚本名后面跟选项和参数,将参数传入脚本中,使用起来非常方便。在工作中,这种应用场景非常多,类似于 Shell 脚本。

六、sys自定义退出状态码

正常状态下,Python 代码正常运行完成,退出码是0。

代码语言:javascript
复制
Process finished with exit code 0

通过 sys.exit(n) 方法,可以自定义退出的状态码。

代码语言:javascript
复制
sys.exit(100)

执行后,退出状态码是传入的参数(传入一个整数)。

代码语言:javascript
复制
Process finished with exit code 100

sys.exit() 没有返回值,上面的结果一般是在 PyCharm 上运行结束时打印的结果,在命令行运行并不会打印。

sys.exit() 是代码的结束,执行到 sys.exit() 后,代码就会退出,后面的代码全部失效。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python 碎片 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档