Python 中常用的標(biāo)準(zhǔn)庫(kù)系列之 sys 模塊
上節(jié)課我們學(xué)習(xí)了 Python 中的 OS 標(biāo)準(zhǔn)庫(kù) ,這節(jié)課我們來(lái)學(xué)習(xí)下另外一個(gè) 標(biāo)準(zhǔn)庫(kù) sys。
1. sys.exit(code)
sys.exit(code) 的功能是退出程序:
- 參數(shù) code,退出代碼,通常 0 代表正常退出,其它值代碼異常退出
- 返回值,無(wú)
演示 sys.exit(code) 的例子如下:
import sys
print('hello')
sys.exit(0)
print('world')
- 在第 3 行,打印 hello
- 在第 4 行,退出程序
- 在第 5 行,打印 world
- 已經(jīng)執(zhí)行 sys.exit(0) 退出了程序,不會(huì)執(zhí)行該行代碼
運(yùn)行程序:
C:\> python exit.py
hello
C:\>
可以看到,程序打印 hello 后即退出了。
2. sys.argv
2.1 命令行參數(shù)
在 windows 和 linux 中,操作系統(tǒng)提供了命令行的控制方式,用戶(hù)輸入命令完成任務(wù)。例如,建立一個(gè)目錄,輸入如下命令:
C:\> mkdir test
這條命令創(chuàng)建了一個(gè)名稱(chēng)為 test 的目錄,字符串 ‘mkdir’ 和字符串 ‘test’ 被稱(chēng)為命令行參數(shù)。
2.2 Python 程序的命令行參數(shù)
Python 將命令行參數(shù)保存在 sys 模塊中的 argv 變量中:
- sys.argv 是一個(gè)數(shù)組
- 數(shù)組中存儲(chǔ)的是字符串
在命令行模式下,使用 python 解釋器執(zhí)行程序 program.py:
C:\> python program.py argument
則命令行參數(shù) sys.argv 等于 [‘program.py’, ‘a(chǎn)rgument’],注意:
- 輸入的命令行由 3 個(gè)單詞構(gòu)成,但是命令行參數(shù)不包括 ‘python’
- 命令行參數(shù)包括 python 程序文件名,即 ‘program.py’
2.3 例子:回顯所有的參數(shù)
編寫(xiě)程序 echo.py,程序顯示所有的參數(shù):
import sys
for arg in sys.argv:
print(arg)
程序遍歷數(shù)組 sys.argv,打印數(shù)組中的參數(shù)。在命令行中運(yùn)行程序:
C:\> python echo.py a b c
echo.py
a
b
c
sys.argv 包括 4 個(gè)參數(shù):‘echo.py’、‘a(chǎn)’、‘b’、‘c’
2.4 例子:命令行計(jì)算器
編寫(xiě)程序 calc.py,對(duì)命令行輸入的表達(dá)式進(jìn)行計(jì)算,例如:
C:\> python calc.py 1 + 1
2
C:\> python calc.py 2 - 1
2
- 在第 1 行,計(jì)算 1 + 1 的結(jié)果
- 在第 3 行,計(jì)算 2 - 1 的結(jié)果
注意:數(shù)字和運(yùn)算符之間必須要有空格
程序 calc.py 的代碼如下:
import sys
if len(sys.argv) != 4:
print('Usage: python calc.py operand [+|-] operand')
sys.exit(0)
left = sys.argv[1]
operator = sys.argv[2]
right = sys.argv[3]
if operator == '+':
print(int(left) + int(right))
if operator == '-':
print(int(left) - int(right))
- 在第 3 行,檢查命令行參數(shù)個(gè)數(shù),正常情況下是 4 個(gè)參數(shù)
- 參數(shù) 0 是 ‘calc.py’
- 參數(shù) 1 是左邊的操作數(shù)
- 參數(shù) 2 是操作符
- 參數(shù) 3 是右邊的操作數(shù)
- 在第 7 行到第 9 行,獲取左邊的操作數(shù)、操作符、右邊的操作數(shù)
- 在第 11 行,求和
- 注意,命令行參數(shù)是字符串,需要使用函數(shù) int(string) 轉(zhuǎn)換為整數(shù)
- 在第 14 行,相減
- 注意,命令行參數(shù)是字符串,需要使用函數(shù) int(string) 轉(zhuǎn)換為整數(shù)
3. 標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出、標(biāo)準(zhǔn)出錯(cuò)
3.1 概述
Python 程序?qū)㈡I盤(pán)抽象成一個(gè)可讀的文件,從鍵盤(pán)讀取用戶(hù)輸入,類(lèi)似于從文件中讀取數(shù)據(jù);Python 程序?qū)⑵聊怀橄蟪梢粋€(gè)可寫(xiě)的文件,向屏幕輸出數(shù)據(jù),類(lèi)似于向文件中寫(xiě)數(shù)據(jù)。
Python 程序執(zhí)行時(shí)會(huì)自動(dòng)打開(kāi)三個(gè)文件:
- 標(biāo)準(zhǔn)輸入文件(stdin),通常對(duì)應(yīng)終端的鍵盤(pán)
- 標(biāo)準(zhǔn)輸出文件(stdout),對(duì)應(yīng)終端的屏幕
- 標(biāo)準(zhǔn)錯(cuò)誤輸出文件(stderr),對(duì)應(yīng)終端的屏幕
程序?qū)臉?biāo)準(zhǔn)輸入文件讀取用戶(hù)輸入,將正常輸出數(shù)據(jù)輸出到標(biāo)準(zhǔn)輸出文件,而將錯(cuò)誤信息輸出到標(biāo)準(zhǔn)錯(cuò)誤文件。
3.2 sys.stdin
sys.stdin 是 python 程序的標(biāo)準(zhǔn)輸入,示例如下:
>>> import sys
>>> line = sys.stdin.readline()
abc
>>> line
'abc\n'
- 在第 2 行,使用 readline() 方法讀取用戶(hù)輸入的一行
- 在第 3 行,用戶(hù)輸入 abc
3.3 sys.stdout
sys.stdout 是 python 程序的標(biāo)準(zhǔn)輸出,示例如下:
import sys
sys.stdout.write('www')
sys.stdout.write('imooc')
sys.stdout.write('com')
- 在第 3 行,使用 write() 方法向屏幕輸出
運(yùn)行程序,輸出如下:
wwwimooccom
從輸出可以看出,sys.stdout.write(text) 和 print(text) 的區(qū)別:
- print(text) 輸出 text 后會(huì)自動(dòng)換行
- sys.stdout.write(text) 輸出 text 后不會(huì)自動(dòng)換行
3.4 sys.stderr
sys.stderr 是 python 程序的標(biāo)準(zhǔn)出錯(cuò),與 sys.stdout 相比:
- 兩者都是將數(shù)據(jù)輸出到屏幕
- 將正常的信息輸出到 sys.stdout
- 將錯(cuò)誤的信息輸出到 sys.stderr
3.5 例子:打印下載進(jìn)度
Python 中的內(nèi)置函數(shù) print(text) 會(huì)自動(dòng)的加入換行,而在某些場(chǎng)景下,不希望輸出換行,例如,打印下載進(jìn)度,顯示效果如下:

程序在運(yùn)行的過(guò)程中,斷斷續(xù)續(xù)的輸出如下文本:
- Downloading 1%
- Downloading 2%
- …
- Downloading 100%
如果使用 print(text),就會(huì)輸出 100 行,無(wú)法達(dá)到上圖的效果。
使用 sys.stdout.write(text) 可以控制程序輸出在同一行,代碼如下:
import sys
import time
for rate in range(100):
text = 'Downloading %d%%' % rate
sys.stdout.write(text)
sys.stdout.write('\r')
time.sleep(1)
- 在第 2 行,引入 time 模塊,需要使用 time 模塊的 sleep 方法
- 在第 4 行,使用 for 循環(huán)模擬下載的過(guò)程,總共輸出 100 行文本
- 在第 6 行,打印當(dāng)前的下載進(jìn)度
- 在第 7 行,輸出 ‘\r’,將光標(biāo)移動(dòng)到行首
- sys.stdout.write(’\r’) 僅僅輸出一個(gè)字符 ‘\r’,不會(huì)再額外輸出換行
- 在第 8 行,使用 time.sleep 睡眠 1 秒
4. sys.path
4.1 概述
Python 的模塊是一個(gè)普通的 Python 文件,例如 os 模塊對(duì)應(yīng)的文件是 os.py。os 模塊是 Python 自帶的模塊,如果 Python 安裝到 C:\Python3 目錄下,在 C:\Python3\Lib 目錄下能找到 os.py,即 os.py 的完整路徑是 C:\Python3\Lib\os.py。
sys.path 是一個(gè)列表,列表保存了多個(gè)路徑名:
>>> 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 的過(guò)程如下:
4.2 例子:自定義模塊查找路徑
本節(jié)演示如何自定義模塊的查找路徑,例子的目錄結(jié)構(gòu)如下:

- 創(chuàng)建目錄 my-modules
mkdir my-modules
- 創(chuàng)建文件 my-modules\utils.py
def add(a, b):
return a + b
def sub(a, b):
return a - b
- 創(chuàng)建文件 main.py
import sys
sys.path.append('my-modules')
import utils
print(utils.add(1, 1))
print(utils.sub(2, 1))
運(yùn)行程序,輸出結(jié)果:
2
1
5. sys.version
sys.version 記錄了 Python 的版本
如果運(yùn)行 Python 3:
>>> sys.version
'2.7.0 (v2.7.17, Nov 7 2019, 10:07:09)'
如果運(yùn)行 Python 2:
>>> sys.version
'3.6.0 (v3.6.0, Dec 23 2016, 08:06:12)'
6. sys.platform
sys.version 記錄了操作系統(tǒng)的型號(hào)。
在 windows 中打印 sys.platform:
>>> sys.platform
'win32'
在 linux 中打印 sys.platform:
>>> sys.platform
'linux'