Python常用标准库学习

前言

Python常用标准库的学习,随手做下笔记

sys 模块

1. sys.exit(code)

sys.exit(code) 的功能是退出程序。

  • 参数 code,退出代码,通常 0 代表正常退出,其它值代码异常退出
  • 返回值,无

演示 sys.exit(code) 的例子:

1
2
3
4
5
6
import sys

print('hello')
sys.exit(0)
print('world')

程序打印 hello 后即退出了,不会执行下一条语句 print(‘world’)。

2. sys.argv

2.1 命令行参数

在 windows 和 linux 中,操作系统提供了命令行的控制方式,用户输入命令完成任务。例如,建立一个目录,输入如下命令:

1
C:\> mkdir test

这条命令创建了一个名称为 test 的目录,字符串 ‘mkdir’ 和字符串 ‘test’ 被称为命令行参数。

2.2 Python 程序的命令行参数

Python 将命令行参数保存在 sys 模块中的 argv 变量中:

  • sys.argv 是一个数组
  • 数组中存储的是字符串

在命令行模式下,使用 python 解释器执行程序 program.py

1
C:\> python program.py argument

则命令行参数 sys.argv 等于 [‘program.py’, ‘argument’],注意:

  • 输入的命令行由 3 个单词构成,但是命令行参数不包括 ‘python’
  • 命令行参数包括 python 程序文件名,即 ‘program.py
sys.argv

以列表的方式获取运行 python 程序的命令行参数,其中, sys.argv[0] 通常指该 python程序本身, sys.argv[1] 代表第一个参数, sys.argv[2] 代表第二个参数,以此类推

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import sys


def start(argv):
if len(argv) < 4:
print('请提供三个参数')
return
print(f'程序名:{argv[0]}')
print(f'第一个参数:{argv[1]}')
print(f'第二个参数:{argv[2]}')
print(f'第三个参数:{argv[3]}')

if __name__ == '__main__':
try:
start(sys.argv[0:])
except KeyboardInterrupt:
print('interrupted by user, killing all threads')

3. 标准输入、标准输出、标准出错

3.1 概述

Python 程序将键盘抽象成一个可读的文件,从键盘读取用户输入,类似于从文件中读取数据;Python 程序将屏幕抽象成一个可写的文件,向屏幕输出数据,类似于向文件中写数据。

Python 程序执行时会自动打开三个文件:

  • 标准输入文件(stdin),通常对应终端的键盘
  • 标准输出文件(stdout),对应终端的屏幕
  • 标准错误输出文件(stderr),对应终端的屏幕

程序将从标准输入文件读取用户输入,将正常输出数据输出到标准输出文件,而将错误信息输出到标准错误文件。

3.2 sys.stdin

sys.stdin 是 python 程序的标准输入

1
2
3
4
5
6
import sys


line = sys.stdin.readline()

print(f'你输入的为{line}')

sys.stdin

3.3 sys.stdout

sys.stdout 是 python 程序的标准输出

1
2
3
4
5
6
import sys

sys.stdout.write('这是')
sys.stdout.write('python标准库的')
sys.stdout.write('sys模块')

输出结果为

1
这是python标准库的sys模块

从输出可以看出,sys.stdout.write(text) 和 print(text) 的区别:

  • print(text) 输出 text 后会自动换行
  • sys.stdout.write(text) 输出 text 后不会自动换行

3.4 sys.stderr

sys.stderr 是 python 程序的标准出错,与 sys.stdout 相比:

  • 两者都是将数据输出到屏幕
  • 将正常的信息输出到 sys.stdout
  • 将错误的信息输出到 sys.stderr

3.5 打印下载速度

Python 中的内置函数 print(text) 会自动的加入换行,而在某些场景下,不希望输出换行

程序在运行的过程中,断断续续的输出如下文本:

  • Downloading 1%
  • Downloading 2%
  • Downloading 100%

如果使用 print(text),就会输出 100 行,无法达到上图的效果。

使用 sys.stdout.write(text) 可以控制程序输出在同一行

1
2
3
4
5
6
7
8
9
import sys
import time


for rate in range(100): # 使用for循环模拟下载的过程,总共输出100行文本
text = 'Downloading %d%%' % rate
sys.stdout.write(text) # 打印当前下载的速度
sys.stdout.write('\r') # 输出'\r', 将光标移动到行首, 仅仅输出一个字符'\r',不会在额外输出换行
time.sleep(1)

4. sys.path

Python 的模块是一个普通的 Python 文件,例如 os 模块对应的文件是 os.py。os 模块是 Python 自带的模块,如果 Python 安装到 C:\Python3 目录下,在 C:\Python3\Lib 目录下能找到 os.py,即 os.py 的完整路径是 C:\Python3\Lib\os.py

sys.path 是一个列表,列表保存了多个路径名

1
2
3
import sys

print(sys.path)

Python 使用 ‘import os’ 引入 os 模块,注意:Python 使用模块名而不是模块的完整路径引入模块

Python 查找模块 os 的过程如下:

  • 在 sys.path[0] 指向的目录 C:\Python3\DLLs 下查找文件 os.py
  • 在 sys.path[1] 指向的目录 C:\Python3\lib 下查找文件 os.py

5. sys.version

sys.version 记录了 Python 的版本

6. sys.platform

sys.version 记录了操作系统的型号。

getopt模块

1. 命令行参数

Python 提供了 getopt 模块来获取命令行参数。

getopt 语法格式如下:

1
getopt.getopt(args, options[, long_options])

getopt 是对 sys.argv获取的命令行参数进行二次处理。在运行程序的时候,可能需要根据不同的条件,输入不同的命令行选项来实现不同的功能,比如-u代表后面是用户,-p代表后面是密码。调用getopt.getopt()会返回两个列表,第一个列表复制给opts,第二个列表复制给args。

  • args: 要解析的命令行参数列表。

  • options: 以字符串的格式定义,options 后的冒号 : 表示该选项必须有附加的参数,不带冒号表示该选项不附加参数。

  • long_options: 以列表的格式定义,long_options 后的等号 = 表示如果设置该选项,必须有附加的参数,否则就不附加参数。

    该方法返回值由两个元素组成: 第一个是 (option, value) 元组的列表。 第二个是参数列表,包含那些没有 - 的参数。

1
2
3
4
5
6
import sys
import getopt

opts, args = getopt.getopt(sys.argv[1:], "u:p:", ["file="])
print(f'opts输出结果为{opts}')
print(f'args输出结果为{args}')

执行

1
python3 demo.py -u user -p password  --file=demo.txt hello,python

输出结果

1
2
opts输出结果为[('-u', 'user'), ('-p', 'password'), ('--file', 'demo.txt')]
args输出结果为['hello,python']

➡ 使用sys.gray[1:] 是为过滤第一个参数(第一个参数为python本身)

➡ “-u:-h” 为定义短格式选项 ( - )。这里的h 和 u 为两个选项。 “h” 后面没有 “:” 表示h这个选项没有选项值, “u”后面有”:” 就必须有选项值

➡ [“help”, “file=”] 为定义长格式选项 (–)。这里的 “=” 和短格式选项中的 “:” 一样,后面必须跟选项值

2. 示例

2.1 短选项模式

定义一个 site() 函数,然后通过命令行输入站点名称 name 和网址 url,可以用缩写 nu:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import sys
import getopt


def site():
name = None
url = None

argv = sys.argv[1:]

try:
# 短选项模式
opts, args = getopt.getopt(argv, "n:u:")

except:
print("Error")

for opt, arg in opts:
if opt in ['-n']:
name = arg
elif opt in ['-u']:
url = arg

print( name + " " + url)


site()

测试代码

1
python3 demo.py -n mochazz -u cyberzone.cloud

输出结果为

1
mochazz cyberzone.cloud

2.2 长选项模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import sys
import getopt


def site():
name = None
url = None

argv = sys.argv[1:]

try:
# 长选项模式
opts, args = getopt.getopt(argv, "n:u:", ["name=", "url="])

except:
print("Error")

for opt, arg in opts:
if opt in ['-n', '--name']:
name = arg
elif opt in ['-u', '--url']:
url = arg

print( name + " " + url)


site()

测试代码

1
python3 demo.py --name mochazz --url cyberzone.cloud

输出结果

1
mochazz cyberzone.cloud

3. Exception getopt.GetoptError

在没有找到参数列表,或选项的需要的参数为空时会触发该异常。

异常的参数是一个字符串,表示错误的原因。属性 msgopt 为相关选项的错误信息。

3.1 示例

假定创建这样一个脚本,可以通过命令行向脚本文件传递两个文件名,同时通过另外一个选项查看脚本的使用。脚本使用方法如下:

1
demo.py -i <inputfile> -o <outputfile>

demo.py 脚本如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import sys
import getopt


def main(argv):
inputfile = ''
outputfile = ''
try:
opts, args = getopt.getopt(argv, 'hi:o:', ['ifile=', 'ofile='])
except getopt.GetoptError:
print('demo.py -i <inputfile> -o <outputfile>')
sys.exit(2)
for opt, arg in opts:
if opt == '-h':
print('demo.py -i <inputfile> -o <outputfile>')
sys.exit()
elif opt in ('-i', '--ifile'):
inputfile = arg
elif opt in ('-i', '--ofile'):
outputfile = arg
print(f'输出的文件为: {inputfile}')
print(f'输出的文件为: {outputfile}')


if __name__ == '__main__':
main(sys.argv[1:])

测试代码

测试代码

参考来源

https://www.runoob.com/python3/python3-command-line-arguments.html

http://www.imooc.com/wiki/pythonlesson2/sysmodule.html


Python常用标准库学习
https://suiyideali.github.io/2023/04/25/Python常用标准库学习/
作者
m0ch4z
发布于
2023年4月25日
更新于
2023年4月27日
许可协议