Python常用標準庫之sys

2020-08-13 13:54:04

sys模組主要是針對與Python直譯器相關的變數和方法,不是主機操作系統。

匯入方式:import sys

sys.argv    #獲取命令列參數列表,第一個元素是程式本身
sys.exit(n) #退出Python程式,exit(0)表示正常退出。當參數非0時,會引發一個SystemExit異常,可以在程式中捕獲該異常
sys.version #獲取Python解釋程器的版本資訊
sys.maxsize #最大的Int值,64位元平臺是2**63 - 1
sys.path    #返回模組的搜尋路徑,初始化時使用PYTHONPATH環境變數的值
sys.platform    #返回操作系統平臺名稱
sys.stdin   #輸入相關
sys.stdout  #輸出相關
sys.stderr  #錯誤相關
sys.exc_info()  #返回異常資訊三元元組
sys.getdefaultencoding()    #獲取系統當前編碼,預設爲utf-8
sys.setdefaultencoding()    #設定系統的預設編碼
sys.getfilesystemencoding() #獲取檔案系統使用編碼方式,預設是utf-8
sys.modules #以字典的形式返回所有當前Python環境中已經匯入的模組
sys.builtin_module_names    #返回一個列表,包含所有已經編譯到Python直譯器裡的模組的名字
sys.copyright   #當前Python的版權資訊
sys.flags   #命令列標識狀態資訊列表。只讀。
sys.getrefcount(object) #返回物件的參照數量
sys.getrecursionlimit() #返回Python最大遞回深度,預設1000
sys.getsizeof(object[, default])    #返回物件的大小
sys.getswitchinterval() #返回執行緒切換時間間隔,預設0.005秒
sys.setswitchinterval(interval) #設定執行緒切換的時間間隔,單位秒
sys.getwindowsversion() #返回當前windwos系統的版本資訊
sys.hash_info   #返回Python預設的雜湊方法的參數
sys.implementation  #當前正在執行的Python直譯器的具體實現,比如CPython
sys.thread_info #當前執行緒資訊

sys.argv

sys.argv是一個指令碼執行參數列表,列表的第一個元素是指令碼名稱,從第二個元素開始纔是真正的參數。

# test.py
import sys

for index, arg in enumerate(sys.argv):
    print("第%d個參數是: %s" % (index, arg))

#輸出
第0個參數是: test.py
第1個參數是: 1
第2個參數是: 2
第3個參數是: 3
第4個參數是: 4 

sys.path

path是一個目錄列表,供Python從中查詢模組。在Python啓動時,sys.path根據內建規則和PYTHONPATH變數進行初始化。sys.path的第一個元素通常是個空字串,表示當前目錄。

>>> sys.path
['', 'C:\\Python36\\Lib\\idlelib', 'C:\\Python36\\python36.zip', 'C:\\Python36\\DLLs', 'C:\\Python36\\lib', 'C:\\Python36', 'C:\\Python36\\lib\\site-packages']

sys.path本質上是一個列表,可以進行append、insert、pop、remove等各種列表相關的操作,但通常都進行append操作,新增自己想要的查詢路徑。

sys.stdin、sys.stdout、sys.stderr

stdin用於所有的互動式輸入(包括input()函數)。
stdout用於print()的列印輸出或者input()函數的提示符。
stderr用於直譯器自己的提示資訊和錯誤資訊。

簡而言之,這三個屬性就是操作系統的標準輸入、輸出和錯誤流,它們返回的都是一個「檔案型別」物件,支援read()、write()和flush()等操作,就像用open()方法開啓的檔案物件那樣!

>>> import sys
>>> s = sys.stdin.read()        # 使用ctrl+d結束輸入
i like python
end



>>> s
'i like python\nend\n\n\n\n'
>>> sys.stdout.write(s)
i like python
end



21

sys.stdout 與 print()

當我們用input('Please input something!')時,事實上是先輸出提示資訊,然後捕獲輸入。 以下兩組等價:

s = input('Please input something!')


print('Please input something!',)  # 逗號表示不換行
s = sys.stdin.readline()[:-1]  # -1 可以拋棄輸入流中的'\n' 換行符,自己琢磨一下爲什麼。

sys.stdininput()

當我們print(obj)的時候,事實上是呼叫了sys.stdout.write(obj+'\n'),將內容列印到控制檯(預設是顯示器),然後追加一個換行符。以下兩行等價:

sys.stdout.write('hello'+'\n') 
print('hello')

從控制檯重定向到檔案

預設情況下sys.stdout指向控制檯。如果把檔案物件賦值給sys.stdout,那麼print ()呼叫的就是檔案物件的write()方法。

f_handler = open('out.log', 'w') 
sys.stdout = f_handler 
print('hello')
# 你無法在螢幕上看到「hello」
# 因爲它被寫到out.log檔案裡了

如果你還想同時在控制檯列印的話,最好先將原始的控制檯物件參照儲存下來,向檔案中列印之後再恢復 sys.stdout.

__console__ = sys.stdout    # 儲存控制檯
# redirection start #       # 去幹點別的,比如寫到檔案裡
... 
# redirection end           # 幹完別的了,恢復原來的控制檯
sys.stdout = __console__

參考: