sys 模組提供了許多函式和變數來處理 Python 執行時環境的不同部分.

處理命令列引數

在直譯器啟動後, argv 列表包含了傳遞給指令碼的所有引數, 列表的第一個元素為指令碼自身的名稱.

使用sys模組獲得指令碼的引數

複製程式碼程式碼如下:

print "script name is", sys.argv[0]        # 使用sys.argv[0]採集指令碼名稱

if len(sys.argv) > 1:
    print "there are", len(sys.argv)-1, "arguments:"  # 使用len(sys.argv)-1採集引數個數-1為減去[0]指令碼名稱
    for arg in sys.argv[1:]:            #輸出除了[0]外所有引數
        print arg
else:
    print "there are no arguments!"


如果是從標準輸入讀入指令碼 (比如 "python < sys-argv-example-1 py p style='font-size:14px;font-style:normal;font-weight:normal;line-height:25.2px;padding:5px 0px 5px 0px;color:rgb(0, 0, 0);text-align:left;float:none;width:660px;height:0px;border-top:0px none rgb(0, 0, 0);border-bottom:0px none rgb(0, 0, 0);border-right:0px none rgb(0, 0, 0);border-left:0px none rgb(0, 0, 0);text-decoration:none;background:rgba(0, 0, 0, 0) none repeat 0% 0%;' ></p>

如果把指令碼作為字串傳遞給python (使用 -c 選項), 指令碼名會被設定為 "-c".

處理模組

path 列表是一個由目錄名構成的列表, Python 從中查詢擴充套件模組( Python 源模組, 編譯模組,或者二進位制擴充套件).

啟動 Python 時,這個列表從根據內建規則, PYTHONPATH 環境變數的內容, 以及登錄檔( Windows 系統)等進行初始化.

由於它只是一個普通的列表, 你可以在程式中對它進行操作,

使用sys模組操作模組搜尋路徑

複製程式碼程式碼如下:

print "path has", len(sys.path), "members"

sys.path.insert(0, "samples")  #將路徑插入到path,[0]中
import sample

sys.path = []  #刪除path中所有路徑
import random 

使用sys模組查詢內建模組

builtin_module_names 列表包含 Python 直譯器中所有內建模組的名稱

複製程式碼程式碼如下:

def dump(module):
    print module, "=>",
    if module in sys.builtin_module_names:  #查詢內建模組是否存在
        print ""
    else:
        module = _ _import_ _(module)         #非內建模組輸出模組路徑
        print module._ _file_ _

dump("os")
dump("sys")
dump("string")
dump("strop")
dump("zlib")

os => C:\python\lib\os.pyc
sys => 
string => C:\python\lib\string.pyc
strop => 
zlib => C:\python\zlib.pyd

使用sys模組查詢已匯入的模組

modules 字典包含所有載入的模組. import 語句在從磁碟匯入內容之前會先檢查這個字典.

Python 在處理你的指令碼之前就已經匯入了很多模組.

複製程式碼程式碼如下:

print sys.modules.keys()


['os.path', 'os', 'exceptions', '_ _main_ _', 'ntpath', 'strop', 'nt',
'sys', '_ _builtin_ _', 'site', 'signal', 'UserDict', 'string', 'stat']

使用sys模組獲得當前平臺

sys.platform  返回當前平臺 出現如: "win32" "linux2" 等

處理標準輸出/輸入

標準輸入和標準錯誤 (通常縮寫為 stdout 和 stderr) 是內建在每一個 UNIX 系統中的管道。

當你 print 某些東西時,結果前往 stdout 管道;

當你的程式崩潰並打印出除錯資訊 (例如 Python 中的 traceback (錯誤跟蹤)) 的時候,資訊前往 stderr 管道

複製程式碼程式碼如下:

>>> for i in range(3):
...     print'Dive in'

Dive in
Dive in
Dive in
>>> import sys
>>> for i in range(3):
...     sys.stdout.write('Dive in')

Dive inDive inDive in
>>> for i in range(3):
...     sys.stderr.write('Dive in')

Dive inDive inDive in

stdout 是一個類檔案物件;呼叫它的 write 函式可以打印出你給定的任何字串。

實際上,這就是 print 函式真正做的事情;它在你列印的字串後面加上一個硬回車,然後呼叫 sys.stdout.write 函式。

在最簡單的例子中,stdout 和 stderr 把它們的輸出傳送到相同的地方

和 stdout 一樣,stderr 並不為你新增硬回車;如果需要,要自己加上。

stdout 和 stderr 都是類檔案物件,但是它們都是隻寫的。

它們都沒有 read 方法,只有 write 方法。然而,它們仍然是類檔案物件,因此你可以將其它任何 (類) 檔案物件賦值給它們來重定向其輸出。

使用sys重定向輸出

複製程式碼程式碼如下:

print 'Dive in'        # 標準輸出
saveout = sys.stdout        # 終在重定向前儲存stdout,這樣的話之後你還可以將其設回正常
fsock = open('out.log', 'w')      # 開啟一個新檔案用於寫入。如果檔案不存在,將會被建立。如果檔案存在,將被覆蓋。
sys.stdout = fsock                 # 所有後續的輸出都會被重定向到剛才開啟的新檔案上。

print  'This message will be logged instead of displayed'    # 這樣只會將輸出結果“列印”到日誌檔案中;螢幕上不會看到輸出

sys.stdout = saveout   # 在我們將 stdout 搞亂之前,讓我們把它設回原來的方式。    

fsock.close()     # 關閉日誌檔案。

重定向錯誤資訊

fsock = open('error.log', 'w')           # 開啟你要儲存除錯資訊的日誌檔案。 
sys.stderr = fsock                           # 將新開啟的日誌檔案的檔案物件賦值給stderr以重定向標準錯誤。
raise Exception, 'this error will be logged'   # 引發一個異常,沒有在螢幕上打印出任何東西,所有正常的跟蹤資訊已經寫進error.log

還要注意你既沒有顯式關閉日誌檔案,也沒有將 stderr 設回最初的值。

這樣挺好,因為一旦程式崩潰 (由於引發的異常),Python 將替我們清理並關閉檔案

列印到 stderr

向標準錯誤寫入錯誤資訊是很常見的,所以有一種較快的語法可以立刻匯出資訊

複製程式碼程式碼如下:

>>> print 'entering function'
entering function
>>> import sys
>>> print >> sys.stderr, 'entering function'

entering function 


print 語句的快捷語法可以用於寫入任何開啟的檔案 (或者是類檔案物件)。

在這裡,你可以將單個print語句重定向到stderr而且不用影響後面的print語句。

使用sys模組退出程式

複製程式碼程式碼如下:

import sys
sys.exit(1)

注意 sys.exit 並不是立即退出. 而是引發一個 SystemExit 異常. 這意味著你可以在主程式中捕獲對 sys.exit 的呼叫

捕獲sys.exit呼叫

複製程式碼程式碼如下:

import sys
print "hello"
try:
    sys.exit(1)
except SystemExit:   # 捕獲退出的異常
    pass                    # 捕獲後不做任何操作
print "there"


hello
there

如果準備在退出前自己清理一些東西(比如刪除臨時檔案), 你可以配置一個 "退出處理函式"(exit handler), 它將在程式退出的時候自動被呼叫

另一種捕獲sys.exit呼叫的方法

複製程式碼程式碼如下:

def exitfunc():
    print "world"

sys.exitfunc = exitfunc  # 設定捕獲時呼叫的函式

print "hello"
sys.exit(1)     # 退出自動呼叫exitfunc()後,程式依然退出了
print "there"  # 不會被 print

hello
world

如對本文有所疑問,請點選進入指令碼之家知識社群提問。