【Python 标准库学习】系统相关的参数和函数库 — sys

欢迎加入 Python 官方文档翻译团队:https://www.transifex.com/python-doc/


sys 模块提供了与 Python 解释器紧密相关的一些变量和函数,这些变量可能被解释器使用,也可能由解释器提供

sys 模块官方文档:https://docs.python.org/3/library/sys.html


部分常用函数:

    • 1、sys.argv
    • 2、sys.path
    • 3、sys.platform
    • 4、sys.getwindowsversion()
    • 5、sys.version
    • 6、sys.exit(n)
    • 7、sys.modules
    • 8、sys.stdin / stdout / stderr


1、sys.argv

获取当前正在执行的命令行参数的参数列表

sys.argv[0] 返回当前程序名,sys.argv[1] 返回第一个参数

sys.argv[2] 返回第二个参数,len(sys.argv)-1 参数个数(减去文件名)

应用举例:在桌面新建一个 test.py,文件路径为:C:\Users\Lenovo\Desktop\test.py,写入以下内容:

import sys
print(sys.argv)
print('当前程序名:%s' %sys.argv[0])
print('第一个参数:%s' %sys.argv[1])
print('第二个参数:%s' %sys.argv[2])
print('参数个数:%s' %(len(sys.argv)-1))

用命令行运行该程序:

C:\Users\Lenovo\Desktop>test.py arg1 arg2
['C:\\Users\\Lenovo\\Desktop\\test.py', 'arg1', 'arg2']
当前程序名:C:\Users\Lenovo\Desktop\test.py
第一个参数:arg1
第二个参数:arg2
参数个数:2

2、sys.path

获取模块文件搜索路径的字符串,或临时指定新搜索路径,可通过在主程序设置临时搜索路径来解决指定文件夹下模块文件的导入问题

应用举例:

>>> import sys                     # 导入 sys 模块
>>> sys.path                       # 执行 path 函数
['', 'E:\\Python\\Lib\\idlelib', 'E:\\Python\\python36.zip', 'E:\\Python\\DLLs', 'E:\\Python\\lib', 'E:\\Python', 'C:\\Users\\Lenovo\\AppData\\Roaming\\Python\\Python36\\site-packages', 'E:\\Python\\lib\\site-packages', 'E:\\Python\\lib\\site-packages\\viz-0.0.5-py3.6.egg', 'E:\\Python\\lib\\site-packages\\win32', 'E:\\Python\\lib\\site-packages\\win32\\lib', 'E:\\Python\\lib\\site-packages\\Pythonwin']
>>> sys.path[0] = 'D:\\test'       # 临时指定新的搜索路径
>>> sys.path                       # 显示临时指定的搜索路径已经存在
['D:\\test', 'E:\\Python\\Lib\\idlelib', 'E:\\Python\\python36.zip', 'E:\\Python\\DLLs', 'E:\\Python\\lib', 'E:\\Python', 'C:\\Users\\Lenovo\\AppData\\Roaming\\Python\\Python36\\site-packages', 'E:\\Python\\lib\\site-packages', 'E:\\Python\\lib\\site-packages\\viz-0.0.5-py3.6.egg', 'E:\\Python\\lib\\site-packages\\win32', 'E:\\Python\\lib\\site-packages\\win32\\lib', 'E:\\Python\\lib\\site-packages\\Pythonwin']
>>> sys.path[0]                    # 获取第一个搜索路径
'D:\\test'                         # 显示第一个搜索路径字符串

3、sys.platform

操作系统标识符判断函数,获取当前执行环境的平台,不同系统的标识符如下:

系统 标识符
Windows win32
linux linux
MacOS darwin
Windows/Cygwin cygwin
AIX aix

应用举例:

>>> import sys
>>> print(sys.platform)
win32

可以利用 platform 结合 sys.path 函数实现不同版本模块文件的导入,如在 Windows 操作系统下导入 Windows 版本的模块文件和在 Linux 操作系统下导入 Linux 版本的模块文件,用代码演示如下:

if sys.platform.startswith('win32'):
	print('调用 Windows 版本的模块文件代码')
elif sys.platform.startswith('linux'):
	print('调用 Linux 版本的模块文件代码')

4、sys.getwindowsversion()

返回描述当前运行的 Windows 版本信息的元组

返回的参数有:

参数 含义
major 主要版本号
minor 次要版本号
build 发布年月
platform 返回一个数值,代表操作系统产品类型号,不同数值代表含义不同
service_pack 一个字符串
service_pack_minor \
service_pack_major \
suite_mask \
product_type 返回一个数值,代表产品类型,不同数值代表含义不同
platform_version 返回当前操作系统的 major (主要版本号)、minor (次要版本号) 和 build (发布年月),类型为一个三元组

platform 可能的值及其含义:

常量 平台
0(VER_PLATFORM_WIN32s) Windows 3.1上的Win32s
1(VER_PLATFORM_WIN32_WINDOWS) Windows 95/98 / ME
2(VER_PLATFORM_WIN32_NT) Windows NT / 2000 / XP / x64
3(VER_PLATFORM_WIN32_CE) Windows CE

product_type 可能的值及其含义:

常量 平台
1(VER_NT_WORKSTATION) 代表系统是工作站
2(VER_NT_DOMAIN_CONTROLLER) 代表系统是域控制器
3(VER_NT_SERVER) 代表系统是服务器,但不是域控制器

组件也可以按名称访问,因此 sys.getwindowsversion()[0] 等同于sys.getwindowsversion().major,为了与以前的版本兼容,只有前5个元素可以通过索引检索。

应用举例:

>>> import sys
>>> print(sys.getwindowsversion())
sys.getwindowsversion(major=10, minor=0, build=18363, platform=2, service_pack='')
>>> 
>>> print(sys.getwindowsversion()[1])
0
>>> 
>>> print(sys.getwindowsversion().platform_version)
(10, 0, 18362)

5、sys.version

返回一个字符串,包含 Python 解释器的版本号以及所用的内部版本号和编译器的附加信息

应用举例:

>>> import sys
>>> print(sys.version)
3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)]

6、sys.exit(n)

程序退出,如果是正常退出是 sys.exit(0),可选参数 n 可以是给定退出状态(默认为零)的整数,也可以是其他类型的对象。如果是整数,则 0 被认为是成功终止,任何非零值被 shell 等视为异常终止。大多数系统要求它在 0 到 127 之间,否则会产生未定义的结果。有些系统有一个为特定退出代码指定特定含义的约定,但这些约定通常不是普遍的;Unix 程序通常使用 2 表示命令行语法错误,使用 1 表示所有其他类型的错误。

应用举例:

import sys

print('I love python!')
sys.exit(0)
print('I love java!')

运行该程序,输出 I love python! 后并没有继续输出 I love java!,因为在执行到 sys.exit(0) 的时候程序就结束了。

7、sys.modules

sys.modules 可以将模块名称映射到已加载的模块的字典,每当程序员导入新的模块,sys.modules 将自动记录该模块,当第二次再导入该模块时,Python 会直接到字典中查找,从而加快了程序运行的速度。

sys.modules 模块拥有字典所拥有的一切方法,可以通过这些方法了解当前的环境加载了哪些模块

应用举例:

>>> import sys
>>> print(sys.modules['os'])
<module 'os' from 'E:\\Python\\lib\\os.py'>
>>>
>>> print(sys.modules['sys'])
<module 'sys' (built-in)>
>>>
>>> print(sys.modules.values())
>>> dict_values([<module 'builtins' (built-in)>, <module 'sys' (built-in)>, ......, <module 'urllib.parse' from 'E:\\Python\\lib\\urllib\\parse.py'>])
>>>
>>> print(sys.modules.keys())
dict_keys(['builtins', 'sys', '_frozen_importlib', '_imp',......, 'pydoc', 'pkgutil', 'urllib', 'urllib.parse'])

8、sys.stdin / stdout / stderr

解释器用于标准输入 (sys.stdin)、输出 (sys.stdout) 和错误 (sys.stderr) 的文件对象。

sys.stdin、sys.stdout 与我们平常使用的 input、print 类似。

Python 在调用 print 时,事实上调用了 sys.stdout.write(obj+'\n'),用例子来说明(以下两行代码等价):

sys.stdout.write('I love python!' + '\n')
print('I love python!')

sys.stdin.readline() 方法会将标准输入全部获取,包括末尾的 \n,使用 len 计算长度时会把换行符 \n 也算进去,而 input() 获取输入时返回的结果是不包含末尾的换行符 \n 的,以下举例说明两者的区别:

>>> import sys
>>> print(len(sys.stdin.readline()))
hello
6
>>> print(len(input()))
hello
5

可以看到,两者输入的字符串都一样,而长度不一样,如果使用了 sys.stdin.readline() 方法,想将其换行符去掉的话,可以用 strip() 函数或者直接切片的方法,示例如下:

>>> import sys
>>> print(len(sys.stdin.readline()))
hello
6
>>> print(len(sys.stdin.readline().strip('\n')))
hello
5
>>> print(len(sys.stdin.readline()[:-1]))
hello
5

你可能感兴趣的:(#,模块学习)