Python SYS模块
上节课我们学习了 Python 中的 OS 标准库 ,这节课我们来学习下另外一个 标准库 sys。
1. sys.exit(code)
演示 sys.exit(code) 的例子如下:
import sysprint('hello')sys.exit()print('world')
运行程序:
C:\> python exit.py hello C:\>
可以看到,程序打印 hello 后即退出了。
2. sys.argv
2.1 命令行参数
在 windows 和 linux 中,操作系统提供了命令行的控制方式,用户输入命令完成任务。例如,建立一个目录,输入如下命令:
C:\> mkdir test
这条命令创建了一个名称为 test 的目录,字符串 ‘mkdir’ 和字符串 ‘test’ 被称为命令行参数。
2.2 Python 程序的命令行参数
Python 将命令行参数保存在 sys 模块中的 argv 变量中:
sys.argv 是一个数组
数组中存储的是字符串
在命令行模式下,使用 python 解释器执行程序 program.py:
C:\> python program.py argument
则命令行参数 sys.argv 等于 [‘program.py’, ‘argument’],注意:
输入的命令行由 3 个单词构成,但是命令行参数不包括 ‘python’
命令行参数包括 python 程序文件名,即 ‘program.py’
2.3 例子:回显所有的参数
import sysfor arg in sys.argv:print(arg)
程序遍历数组 sys.argv,打印数组中的参数。在命令行中运行程序:
C:\> python echo.py a b c echo.py a b c
sys.argv 包括 4 个参数:‘echo.py’、‘a’、‘b’、‘c’
2.4 例子:命令行计算器
编写程序 calc.py,对命令行输入的表达式进行计算,例如:
C:\> python calc.py 1 + 1 2 C:\> python calc.py 2 - 1 2
在第 1 行,计算 1 + 1 的结果
在第 3 行,计算 2 - 1 的结果
注意:数字和运算符之间必须要有空格
import sysif len(sys.argv) != :print('Usage: python calc.py operand [+|-] operand')sys.exit()left = sys.argv[]operator = sys.argv[]right = sys.argv[]if operator == '+':print(int(left) + int(right))if operator == '-':print(int(left) - int(right))
在第 3 行,检查命令行参数个数,正常情况下是 4 个参数
参数 0 是 ‘calc.py’
参数 1 是左边的操作数
参数 2 是操作符
参数 3 是右边的操作数
在第 7 行到第 9 行,获取左边的操作数、操作符、右边的操作数
在第 11 行,求和
注意,命令行参数是字符串,需要使用函数 int(string) 转换为整数
在第 14 行,相减
注意,命令行参数是字符串,需要使用函数 int(string) 转换为整数
3. 标准输入、标准输出、标准出错
3.1 概述
Python 程序将键盘抽象成一个可读的文件,从键盘读取用户输入,类似于从文件中读取数据;Python 程序将屏幕抽象成一个可写的文件,向屏幕输出数据,类似于向文件中写数据。
程序将从标准输入文件读取用户输入,将正常输出数据输出到标准输出文件,而将错误信息输出到标准错误文件。
3.2 sys.stdin
sys.stdin 是 python 程序的标准输入,示例如下:
>>> import sys>>> line = sys.stdin.readline()abc>>> line'abc\n'
3.3 sys.stdout
sys.stdout 是 python 程序的标准输出,示例如下:
import sys sys.stdout.write('www')sys.stdout.write('imooc')sys.stdout.write('com')
运行程序,输出如下:
wwwimooccom
从输出可以看出,sys.stdout.write(text) 和 print(text) 的区别:
3.4 sys.stderr
sys.stderr 是 python 程序的标准出错,与 sys.stdout 相比:
3.5 例子:打印下载进度
Python 中的内置函数 print(text) 会自动的加入换行,而在某些场景下,不希望输出换行,例如,打印下载进度,显示效果如下:
程序在运行的过程中,断断续续的输出如下文本:
Downloading 1%
Downloading 2%
…
Downloading 100%
如果使用 print(text),就会输出 100 行,无法达到上图的效果。
使用 sys.stdout.write(text) 可以控制程序输出在同一行,代码如下:
import sysimport timefor rate in range():text = 'Downloading %d%%' % rate sys.stdout.write(text)sys.stdout.write('\r')time.sleep()
4. sys.path
4.1 概述
Python 的模块是一个普通的 Python 文件,例如 os 模块对应的文件是 os.py。os 模块是 Python 自带的模块,如果 Python 安装到 C:\python3 目录下,在 C:\python3\Lib 目录下能找到 os.py,即 os.py 的完整路径是 C:\python3\Lib\os.py。
sys.path 是一个列表,列表保存了多个路径名:
>>> import sys>>> sys.path['C:\\python3\\DLLs', 'C:\\python3\\lib', 'C:\\python3\\lib\\plat-win', 'C:\\python3\\lib\\lib-tk', 'C:\\python3', 'C:\\python3\\lib\\site-packages', 'C:\\python3\\lib\\site-packages\\win32']
Python 使用 ‘import os’ 引入 os 模块,注意:Python 使用模块名而不是模块的完整路径引入模块。Python 查找模块 os 的过程如下:
4.2 例子:自定义模块查找路径
本节演示如何自定义模块的查找路径,例子的目录结构如下:
创建目录 my-modules
mkdir my-modules
def add(a, b):return a + bdef sub(a, b):return a - b
import sys sys.path.append('my-modules')import utilsprint(utils.add(, ))print(utils.sub(, ))
在第 2 行,将 my-modules 目录加入到搜索路径中
在第 4 行,通过模块名 utils 导入模块
运行程序,输出结果:
2 1
5. sys.version
sys.version 记录了 Python 的版本
如果运行 Python 3:
>>> sys.version'2.7.0 (v2.7.17, Nov 7 2019, 10:07:09)'
如果运行 Python 2:
>>> sys.version'3.6.0 (v3.6.0, Dec 23 2016, 08:06:12)'
6. sys.platform
sys.version 记录了操作系统的型号。
在 windows 中打印 sys.platform:
>>> sys.platform'win32'
在 linux 中打印 sys.platform:
>>> sys.platform'linux'