Python库 sys 模块详解

Python 标准库 sys 模块详解​

Python sys 模块详解

1. 简介

“sys”即“system”,“系统”之意。该模块提供了一些接口,用于访问 Python 解释器自身使用和维护的变量,同时模块中还提供了一部分函数,可以与解释器进行比较深度的交互。

2. 常用功能

2.1 sys.argv

“argv”即“argument value”的简写,是一个列表对象,其中存储的是在命令行调用 Python 脚本时提供的“命令行参数”。

这个列表中的第一个参数是被调用的脚本名称,也就是说,调用 Python 解释器的“命令”(

python

)本身并没有被加入这个列表当中。这个地方要注意一下,因为这一点跟 C 程序的行为有所不同,C 程序读取命令行参数是从头开始的。

举例来说,在当前目录下新建一个 Python 文件

sys_argv_example.py

,其内容为:

import sysprint("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

在《第26天: Python 标准库之 os 模块详解》中,我们提到过“查看

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.4 sys.executable

该属性是一个字符串,在正常情况下,其值是当前运行的 Python 解释器对应的可执行程序所在的绝对路径。

比如在 Windows 上使用 Anaconda 安装的 Python,该属性的值就是:

>>> sys.executable
'E:\\Anaconda\\Anaconda\\python.exe'

2.5 sys.modules

该属性是一个字典,包含的是各种已加载的模块的模块名到模块具体位置的映射。

通过手动修改这个字典,可以重新加载某些模块;但要注意,切记不要大意删除了一些基本的项,否则可能会导致 Python 整个儿无法运行。

关于其具体的值,由于内容过多,就不在此给出示例了,读者可以自行查看。

2.6 sys.builtin_module_names

该属性是一个字符串元组,其中的元素均为当前所使用的的 Python 解释器内置的模块名称。

注意区别

sys.modules

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', '_md5', '_multibytecodec', '_opcode', '_operator', '_pickle', '_random', '_sha1', '_sha256', '_sha3', '_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')

2.7 sys.path

A list of strings that specifies the search path for modules. Initialized from the environment variable

PYTHONPATH

, 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]
''

3. 进阶功能

3.1 sys.stdin

即 Python 的标准输入通道。通过改变这个属性为其他的类文件(file-like)对象,可以实现输入的重定向,也就是说可以用其他内容替换标准输入的内容。

所谓“标准输入”,实际上就是通过键盘输入的字符。

在示例(

sys_stdin_example.py

)中,我们尝试把这个属性的值改为一个打开的文件对象

hello_python.txt

,其中包含如下的内容:

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("count_log.txt", 'a', encoding='utf-8') as f:sys.stdout = ffor i in range(10):print("count = ", i)

3.3 sys.err

与前面两个属性类似,只不过该属性标识的是标准错误,通常也是定向到屏幕的,可以粗糙地认为是一个输出错误信息的特殊的标准输出流。由于性质类似,因此不做演示。

此外,

sys

模块中还存在几个“私有”属性:

sys.__stdin__

sys.__stdout__

sys.__stderr__

。这几个属性中保存的就是最初定向的“标准输入”、“标准输出”和“标准错误”流。在适当的时侯,我们可以借助这三个属性将

sys.stdin

sys.stdout

sys.err

恢复为初始值。

3.4 sys.getrecursionlimit() 和 sys.setrecursionlimit()

sys.getrecursionlimit()

sys.setrecursionlimit()

是成对的。前者可以获取 Python 的最大递归数目,后者则可以设置最大递归数目。因为初学阶段很少用到,因此只做了解。

3.5 sys.getrefcount()

在《第12天:Python 之引用》中我们其实已经用到过这个函数,其返回值是 Python 中某个对象被引用的次数。关于“引用”的知识可以回去看看这篇文章。

3.6 sys.getsizeof()

这个函数的作用与 C 语言中的

sizeof

运算符类似,返回的是作用对象所占用的字节数。

比如我们就可以看看一个整型对象

1

在内存中的大小:

>>> sys.getsizeof(1)
28

注意,在 Python 中,某类对象的大小并非一成不变的:

>>> sys.getsizeof(2**30-1)
28
>>> sys.getsizeof(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_digitnumber of bits held in each digit. Python integers are stored internally in base 2**int_info.bits_per_digit
sizeof_digitsize 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 个字节用以保存某个整数。

因此在

sys.getsizeof()

的示例中,我们可以看到

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:

有点儿意思吧?

注意不要忘了在字符串最后加个空格,否则提示符就会和你输入的内容混杂在一起了,会十分难看的哟~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/223946.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统中的作业管理

从用户的角度看,作业是系统为完成一个用户的计算任务(或一次事务处理)所做的工作总和。例如,对于用户编制的源程序,需经过对源程序的编译、连接编辑或连接装入及运行产生计算结果。这其中的每一个步骤,常称…

国产化软件新浪潮: spring 改造替代...

中午看了篇《国产化软件新浪潮:jdk redis mysql tomcat nginx改造替代品及信创名录》 想给它补充个 spring 改造替代:) 七、Spring 替代品 - Solon 生态 1、Java 新的生态级框架 从零开始构建,有自己的标准规范与开放生态&…

laravel的安装

laravel的安装(Composer小皮) Composer的安装 windows下安装 https://getcomposer.org/Composer-Setup.exe 修改镜像 阿里云: composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ 华为云: compos…

机器学习---KNN最近邻算法

1、KNN最近邻算法 K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一,有监督算法。该方法的思路是:如果一个样本在特征空间中的k个最相似的样本中的大多数属于某一个…

深度学习 Day12——P1实现mnist手写数字识别

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 文章目录 前言1 我的环境2 代码实现与执行结果2.1 前期准备2.1.1 引入库2.1.2 设置GPU(如果设备上支持GPU就使用GPU,否则使用C…

React中的setState执行机制

我这里今天下雨了,温度一下从昨天的22度降到今天的6度,家里和学校已经下了几天雪了,还是想去玩一下的,哈哈,只能在图片里看到了。 一. setState是什么 它是React组件中用于更新状态的方法。它是类组件中的方法&#x…

【LeetCode刷题-树】-- 103.二叉树的锯齿形层序遍历

103.二叉树的锯齿形层序遍历 方法:广度优先搜索 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int …

Leetcode—78.子集【中等】

2023每日刷题&#xff08;五十九&#xff09; Leetcode—78.子集 算法思想 实现代码 class Solution { public:vector<vector<int>> subsets(vector<int>& nums) {int len nums.size();vector<int> path;vector<vector<int>> ans;f…

Word公式居中+序号右对齐

Word公式居中序号右对齐 # 号制表位法表格法Mathtype法 # 号 制表位法 表格法 Mathtype法 参考1 参考2

深拷贝、浅拷贝 react的“不可变值”

知识获取源–晨哥&#xff08;现实中的人 嘿嘿&#xff09; react中如果你想让一个值始终不变 或者说其他操作不影响该值 它只是作用初始化的时候 使用了浅拷贝–改变了初始值 会改变初始值(selectList1) 因为使用浅拷贝都指向同一个地址 const selectList1 { title: 大大, …

UML概扩知识点

UML是一个重要的知识点&#xff0c;考察的频度也很高。我们需要了解的是UML的一系列的图&#xff0c;红框里的是最核心的。 其次是对各种关系有了解&#xff08;红框里的&#xff1a; 依赖关系&#xff0c;关联关系&#xff0c;泛化关系&#xff0c;实现关系&#xff09; UM…

多维时序 | MATLAB实现TSOA-TCN-Multihead-Attention多头注意力机制多变量时间序列预测

多维时序 | MATLAB实现TSOA-TCN-Multihead-Attention多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现TSOA-TCN-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现TSOA-TCN-Multihead-…

5G CPE可代替宽带,解决断网问题

最近某运营商就玩起了套餐&#xff0c;断用户的网。 老百姓对宽带半知不解&#xff0c;网络断了没法上网&#xff0c;很着急。因为相信运营商&#xff0c;维修人员怎么说&#xff0c;老百姓就怎么办呗&#xff0c;直到最后才发现自己上当&#xff0c;但钱都给了。 截至2023年9月…

批量复制文件,自动跳过重名,高效文件管理从此开始“

你是否曾经遇到过需要批量复制文件&#xff0c;但又担心重名文件覆盖的问题&#xff1f;现在&#xff0c;我们有一个好消息要告诉你——你可以使用我们的文件管理工具&#xff0c;一键批量复制文件到指定文件夹&#xff0c;并自动跳过重名文件&#xff0c;高效管理你的文件从此…

全栈开发中的安全注意事项:最佳实践和工具

安全性是当今数字环境中最重要的问题&#xff0c;而在全栈开发中这一点尤为重要。当企业努力创建强大且动态的应用程序时&#xff0c;他们必须应对复杂的安全威胁领域。在本文中&#xff0c;我们将探讨开发人员可以用来确保安全的全栈开发环境的最佳实践和工具。 1.1 全栈开发的…

在windows系统搭建LVGL模拟器(codeblock工程)

1.codeblock准备 下载codeblock(mingw)&#xff0c;安装。可参考网上教程。 2.pc_simulator_win_codeblocks 工程获取 仓库地址&#xff1a;lvgl/lv_port_win_codeblocks: Windows PC simulator project for LVGL embedded GUI Library (github.com) 拉取代码到本地硬盘&…

Makefile基础使用与原理

一、基本概念 通常我们编写好代码后&#xff0c;都需要编译&#xff0c;只是这些操作是由IDE来完成&#xff0c;我们只需要点击一个编译按钮。当项目工程越来越庞大&#xff0c;存在几十个甚至更多的文件的时候&#xff0c;你使用的不是IDE工具&#xff0c;而是命令行&#xf…

图像色彩还原算法

图像色彩还原算法的目标是改善或修复图像中失真、退色或其他色彩问题。以下是一些常见的图像色彩还原算法&#xff1a; 白平衡算法&#xff1a; 白平衡算法旨在校正图像中的色温&#xff0c;使其看起来更自然。其中一种简单的方法是灰度世界假设&#xff0c;即假设整个图像的平…

Repo代码仓库搭建

使用rockchip sdk二次开发&#xff0c;代码十几个G&#xff0c;都放在一个git仓库的话&#xff0c;每次git status要等好久&#xff0c;决定拆分一下&#xff0c;官方是用repo做代码管理的&#xff0c;我打算也搭建个类似开发环境。 1.首先在git服务器上创建一个manifest仓库&…

建立海外SD-WAN专线网络的成本分析

高速、稳定的网络连接是企业成功拓宽海外市场和开展海外业务的关键因素之一。作为一种提供更高质量和性能的连接的网络解决方案&#xff0c;海外SD-WAN专线被越来越多的企业选择。以下将详细介绍建立海外SD-WAN专线网络的成本组成&#xff0c;以协助企业更全面地了解和规划对网…