pythonsys模块详解
Python sys 模块详解
1. 简介
“sys”即“system”,“系统”之意。该模块提供了⼀些接⼝,⽤于访问 Python 解释器⾃⾝使⽤和维护的变量,同时模块中还提供了⼀部分函数,可以与解释器进⾏⽐较深度的交互。
2. 常⽤功能
2.1 sys.argv
“argv”即“argument value”的简写,是⼀个列表对象,其中存储的是在命令⾏调⽤ Python 脚本时提供的“命令⾏参数”。
这个列表中的第⼀个参数是被调⽤的脚本名称,也就是说,调⽤ Python 解释器的“命令”(python)本⾝并没有被加⼊这个列表当中。这个地⽅要注意⼀下,因为这⼀点跟 C 程序
python怎么读取py文件的⾏为有所不同,C 程序读取命令⾏参数是从头开始的。
举例来说,在当前⽬录下新建⼀个 Python ⽂件sys_argv_example.py,其内容为:
import sys
print("The list of command line arguments:\n", sys.argv)
在命令⾏运⾏该脚本:
$ python sys_argv_example.py
The list of command line arguments:
['example.py']
加上⼏个参数试试:
$ python sys_argv_example.py arg1 arg2 arg3
The list of command line arguments:
['example.py', 'arg1', 'arg2', 'arg3']
利⽤好这个属性,可以极⼤增强 Python 脚本的交互性。
2.2 sys.platform
在《》中,我们提到过“查看sys模块中的sys.platform属性可以得到关于运⾏平台更详细的信息”,这⾥我们就来试试:
>>> import sys
>>> sys.platform
'win32'
在 Linux 上:
>>> sys.platform
'linux'
⽐较⼀下os.name的结果,不难发现,sys.platform的信息更加准确。
2.3 sys.byteorder
“byteorder”即“字节序”,指的是在计算机内部存储数据时,数据的低位字节存储在存储空间中的⾼位还是低位。
“⼩端存储”时,数据的低位也存储在存储空间的低位地址中,此时sys.byteorder的值为“little”。如果不注意,在按地址顺序打印内容的时候,可能会把⼩端存储的内容打错。当前⼤
部分机器都是使⽤的⼩端存储。
所以不出意外的话,你的机器上执⾏下述交互语句也应当跟我的结果⼀样:
>>> sys.byteorder
'little'
⽽另外还存在⼀种存储顺序是“⼤端存储”,即数据的⾼位字节存储在存储空间的低位地址上,此时sys.byteorder的值为“big”。
这种⽅式看起来好像很合理也很⾃然,因为我们⼀般在书⾯表⽰的时候都将低位地址写在左边,⾼位地址写在右边,⼤端存储的顺序就很符合⼈类的阅读习惯。但实际上对机器
⽽⾔,内存地址并没有左右之分,所谓的“⾃然”其实并不存在。
抱歉我并没有使⽤⼤端存储的机器可以⽤作演⽰,因此只能说如果是⼤端存储的机器上运⾏ Python,输出结果应该像下⾯这样,也就是说下⾯这个⽰例并⾮我得到的真实运⾏结
果,仅供参考:
>>> sys.byteorder
'big'
2.utable
该属性是⼀个字符串,在正常情况下,其值是当前运⾏的 Python 解释器对应的可执⾏程序所在的绝对路径。
⽐如在 Windows 上使⽤ Anaconda 安装的 Python,该属性的值就是:
>>> utable
'E:\\Anaconda\\Anaconda\\'
2.dules
该属性是⼀个字典,包含的是各种已加载的模块的模块名到模块具体位置的映射。
通过⼿动修改这个字典,可以重新加载某些模块;但要注意,切记不要⼤意删除了⼀些基本的项,否则可能会导致 Python 整个⼉⽆法运⾏。
关于其具体的值,由于内容过多,就不在此给出⽰例了,读者可以⾃⾏查看。
2.6 sys.builtin_module_names
该属性是⼀个字符串元组,其中的元素均为当前所使⽤的的 Python 解释器内置的模块名称。
注意区别dules和sys.builtin_module_names——前者的关键字(keys)列出的是导⼊的模块名,⽽后者则是解释器内置的模块名。
其值⽰例如下:
>>> sys.builtin_module_names
('_abc', '_ast', '_bisect', '_blake2', '_codecs', '_codecs_cn', '_codecs_hk', '_codecs_iso2022', '_codecs_jp', '_codecs_kr', '_codecs_tw', '_collections', '_contextvars', '_csv', '_datetime', '_functools', '_heapq', '_imp', '_io', '_json', '_locale', '_lsprof'
2.7 sys.path
A list of strings that specifies the search path for modules. Initialized from the environment variable , plus an installation-dependent default.
该属性是⼀个由字符串组成的列表,其中各个元素表⽰的是 Python 搜索模块的路径;在程序启动期间被初始化。
其中第⼀个元素(也就是path[0])的值是最初调⽤ Python 解释器的脚本所在的绝对路径;如果是在交互式环境下查看sys.path的值,就会得到⼀个空字符串。
命令⾏运⾏脚本(脚本代码见⽰例sys_path_example.py):
$ python sys_path_example.py
The path[0] = D:\justdopython\sys_example
交互式环境查看属性第⼀个元素:
>>> sys.path[0]
''
2.it
功能:执⾏到主程序末尾,解释器⾃动退出,但是如果需要中途退出程序,可以调⽤it函数,带有⼀个可选的整数参数返回给调⽤它的程序,表⽰你可以在主程序中捕获对it的调⽤。(0是正常退出,其他为异常)
3. 进阶功能
3.1 sys.stdin
即 Python 的标准输⼊通道。通过改变这个属性为其他的类⽂件(file-like)对象,可以实现输⼊的重定向,也就是说可以⽤其他内容替换标准输⼊的内容。
所谓“标准输⼊”,实际上就是通过键盘输⼊的字符。
在⽰例(sys_stdin_example.py)中,我们尝试把这个属性的值改为⼀个打开的⽂件对象,其中包含如下的内容:
Hello Python!
Just do Python, go~
Go, Go, GO!
由于input()使⽤的就是标准输⼊流,因此通过修改sys.stdin的值,我们使⽤⽼朋友input()函数,也可以实现对⽂件内容的读取,程序运⾏效果如下:
$ python sys_stdin_example.py
Hello Python!
Just do Python, go~
Go, Go, GO!
3.2 sys.stdout
与上⼀个“标准输⼊”类似,sys.stdout则是代表“标准输出”的属性。
通过将这个属性的值修改为某个⽂件对象,可以将本来要打印到屏幕上的内容写⼊⽂件。
⽐如运⾏⽰例程序sys_stdout_example.py,⽤来临时⽣成⽇志也是⼗分⽅便的:
import sys
# 以附加模式打开⽂件,若不存在则新建
with open("", 'a', encoding='utf-8') as f:
sys.stdout = f
for i in range(10):
print("count = ", i)
3.
与前⾯两个属性类似,只不过该属性标识的是标准错误,通常也是定向到屏幕的,可以粗糙地认为是⼀个输出错误信息的特殊的标准输出流。由于性质类似,因此不做演⽰。
此外,sys模块中还存在⼏个“私有”属性:sys.__stdin__,sys.__stdout__,sys.__stderr__。这⼏个属性中保存的就是最初定向的“标准输⼊”、“标准输出”和“标准错误”流。在适当的时侯,我们可以借助这三个属性将sys.stdin、sys.stdout和恢复为初始值。
3.ursionlimit() 和 sys.setrecursionlimit()
3.fcount()
在《》中我们其实已经⽤到过这个函数,其返回值是 Python 中某个对象被引⽤的次数。关于“引⽤”的知识可以回去看看这篇⽂章。
3.sizeof()
这个函数的作⽤与 C 语⾔中的sizeof运算符类似,返回的是作⽤对象所占⽤的字节数。
⽐如我们就可以看看⼀个整型对象1在内存中的⼤⼩:
>>> sizeof(1)
28
注意,在 Python 中,某类对象的⼤⼩并⾮⼀成不变的:
>>> sizeof(2**30-1)
28
>>> sizeof(2**30)
32
3.7 sys.int_info 和 sys.float_info
这两个属性分别给出了 Python 中两个重要的数据类型的相关信息。
其中sys.int_info的值为:
>>> sys.int_info
sys.int_info(bits_per_digit=30, sizeof_digit=4)
在⽂档中的解释为:
属性解释
bits_per_digit number of bits held in each digit. Python integers are stored internally in base 2**int_info.bits_per_digit
sizeof_digit size in bytes of the C type used to represent a digit
指的是 Python 以 2 的sys.int_info.bits_per_digit次⽅为基来表⽰整数,也就是说它是“2 的sys.int_info.bits_per_digit次⽅进制”的数。这样的数每⼀个为都⽤ C 类中的 4 个字节来存储。
换句话说,每“进 1 位”(即整数值增加2 的sys.int_info.bits_per_digit次⽅),就需要多分配 4 个字节⽤以保存某个整数。
因此在sizeof()的⽰例中,我们可以看到2**30-1和2**30之间,虽然本⾝只差了 1,但是所占的字节后者却⽐前者多了 4。
⽽sys.float_info的值则是:
>>> sys.float_info
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon
=2.220446049250313e-16, radix=2, rounds=1)其中各项具体的含义就不在这⾥继续展开了,感兴趣的同学可以参看和等讲解组成原理的书。
4. ⼀个有趣的功能
接下来让我们放松⼀下。
每次打开 Python 的交互式界⾯,我们都会看到⼀个提⽰符>>>。不知道你有没有想过要把这个东西换成另外的什么呢?
反正我没想过哈哈——⾄少在⽂档中看到这两个属性之前,我确实没有想过。哪两个属性呢?
就这俩货:sys.ps1和sys.ps2
所谓“ps”,应当是“prompts”的简写,即“提⽰符”。
这两个属性中,sys.ps1代表的是⼀级提⽰符,也就是进⼊ Python 交互界⾯之后就会出现的那⼀个>>>;⽽第⼆个sys.ps2则是⼆级提⽰符,是在同⼀级内容没有输⼊完,换⾏之后
新⾏⾏⾸的提⽰符...。当然,两个属性都是字符串。
好了,知道怎么回事⼉就好办了。
现在我们就来⼀个:
>>> sys.ps1 = "justdopython "
justdopython li = [1,2,3]
justdopython li[0]
1
justdopython
提⽰符已经被改变了,当然,有点长,不⼤美观哈哈。
咱们换⼀下:
justdopython sys.ps1 = "ILoveYou: "
ILoveYou: print("你可真是个⼩机灵⿁⼉!")
你可真是个⼩机灵⿁⼉!
ILoveYou:
有点⼉意思吧?
注意不要忘了在字符串最后加个空格,否则提⽰符就会和你输⼊的内容混杂在⼀起了,会⼗分难看的哟~
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论