亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

Python 中常用的標準庫系列之 sys 模塊

上節課我們學習了 Python 中的 OS 標準庫 ,這節課我們來學習下另外一個 標準庫 sys。

1. sys.exit(code)

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

  • 參數 code,退出代碼,通常 0 代表正常退出,其它值代碼異常退出
  • 返回值,無

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

import sys

print('hello')
sys.exit(0)
print('world')
  • 在第 3 行,打印 hello
  • 在第 4 行,退出程序
  • 在第 5 行,打印 world
    • 已經執行 sys.exit(0) 退出了程序,不會執行該行代碼

運行程序:

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 例子:回顯所有的參數

編寫程序 echo.py,程序顯示所有的參數:

import sys

for 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 的結果

注意:數字和運算符之間必須要有空格

  • 正確的輸入:python calc.py 1 + 1
  • 錯誤的輸入:python calc.py 1+1

程序 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 行,檢查命令行參數個數,正常情況下是 4 個參數
    • 參數 0 是 ‘calc.py
    • 參數 1 是左邊的操作數
    • 參數 2 是操作符
    • 參數 3 是右邊的操作數
  • 在第 7 行到第 9 行,獲取左邊的操作數、操作符、右邊的操作數
  • 在第 11 行,求和
    • 注意,命令行參數是字符串,需要使用函數 int(string) 轉換為整數
  • 在第 14 行,相減
    • 注意,命令行參數是字符串,需要使用函數 int(string) 轉換為整數

3. 標準輸入、標準輸出、標準出錯

3.1 概述

Python 程序將鍵盤抽象成一個可讀的文件,從鍵盤讀取用戶輸入,類似于從文件中讀取數據;Python 程序將屏幕抽象成一個可寫的文件,向屏幕輸出數據,類似于向文件中寫數據。

Python 程序執行時會自動打開三個文件:

  • 標準輸入文件(stdin),通常對應終端的鍵盤
  • 標準輸出文件(stdout),對應終端的屏幕
  • 標準錯誤輸出文件(stderr),對應終端的屏幕

程序將從標準輸入文件讀取用戶輸入,將正常輸出數據輸出到標準輸出文件,而將錯誤信息輸出到標準錯誤文件。

3.2 sys.stdin

sys.stdin 是 python 程序的標準輸入,示例如下:

>>> import sys
>>> line = sys.stdin.readline()
abc
>>> line
'abc\n'
  • 在第 2 行,使用 readline() 方法讀取用戶輸入的一行
  • 在第 3 行,用戶輸入 abc

3.3 sys.stdout

sys.stdout 是 python 程序的標準輸出,示例如下:

import sys

sys.stdout.write('www')
sys.stdout.write('imooc')
sys.stdout.write('com')
  • 在第 3 行,使用 write() 方法向屏幕輸出

運行程序,輸出如下:

wwwimooccom

從輸出可以看出,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) 可以控制程序輸出在同一行,代碼如下:

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 循環模擬下載的過程,總共輸出 100 行文本
    • 在第 6 行,打印當前的下載進度
    • 在第 7 行,輸出 ‘\r’,將光標移動到行首
      • sys.stdout.write(’\r’) 僅僅輸出一個字符 ‘\r’,不會再額外輸出換行
    • 在第 8 行,使用 time.sleep 睡眠 1 秒

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 的過程如下:

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

4.2 例子:自定義模塊查找路徑

本節演示如何自定義模塊的查找路徑,例子的目錄結構如下:

目錄結構
  1. 創建目錄 my-modules
mkdir my-modules
  1. 創建文件 my-modules\utils.py
def add(a, b):
    return a + b

def sub(a, b):
    return a - b
  1. 創建文件 main.py
import sys
sys.path.append('my-modules')

import utils
print(utils.add(1, 1))
print(utils.sub(2, 1))
  • 在第 2 行,將 my-modules 目錄加入到搜索路徑中
  • 在第 4 行,通過模塊名 utils 導入模塊
    • 導入模塊時,在 sys.path 指定的目錄下查找 utils.py
    • sys.path 包括目錄 my-modules,因此能找到 utils.py

運行程序,輸出結果:

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'