1. 程式人生 > 其它 >python模組之sys

python模組之sys

1. 簡介

“sys”即“system”,“系統”之意。該模組提供了一些介面,用於訪問 Python 直譯器自身使用和維護的變數,同時模組中還提供了一部分函式,可以與直譯器進行比較深度的互動。

2. 變數和函式

sys模組常用的變數和函式及其功能見下表:

  1. sys.argv 獲取執行Python程式的命令列引數。其中sys.argv[0]通常是指該Python程式,sys.argv[1]代表為Python程式提供的第一個引數,sys.argv[2]代表為Python程式提供的第二個引數······以此類推。
  2. sys.path 是一個字串列表,其中每個字串都是一個目錄名,在使用import語句匯入模組時,直譯器就會從這些目錄中查詢指定的模組。
  3. sys.exit() 通過引發SystemExit異常來退出程式。將其放在try塊中不能阻止finally塊的執行。你可以提供一個整數作為引數(預設為0,標識成功),用來標識程式是否成功執行,這是UNIX的一個慣例。
  4. sys.modules 返回模組名和載入模組對應關係的字典。
  5. sys.platform 此變數是一個字串,標識直譯器當前正在執行的平臺名稱,它可能是標識作業系統的名稱,也可能是標識其他種類的平臺,如果執行Jython的話,就是Java虛擬機器。
  6. sys.stdin、sys.stdout、sys.stderr 這三個模組變數是類檔案流物件,分別表示標準輸入、標準輸出、標準錯誤。簡單理解,Python利用sys.stdin獲得輸入,利用sys.stdout輸出。
  7. sys.flags 該只讀屬性返回執行Python命令時指定的旗標。
  8. sys.getfilesystemencoding() 返回在當前系統中儲存檔案所用的字符集。
  9. sys.getrefcount(object) 返回指定物件的引用計數。前面介紹過,當object物件的引用計數為0時,系統會回收該物件。
  10. sys.getswitchinterval() 返回在當前Python直譯器中執行緒切換的時間間隔。該屬性可通過setswitchinterval()函式改變。
  11. sys.implementation 返回當前Python直譯器的實現。
  12. sys.maxsize 返回Python整數支援的最大值。在32位平臺上,該屬性值為2**32-1;在64位平臺上,該屬性值為2**63-1。
  13. sys.executable 該屬性返回Python直譯器在磁碟上的儲存路徑。
  14. sys.byteorder 顯示本地位元組序的指示符。如果本地位元組序是大端模式,則該屬性返回big;否則返回little。
  15. sys.copyright 該屬性返回與Python直譯器有關的版權資訊。
  16. sys.version 返回當前Python直譯器的版本資訊。
  17. sys.winver 返回當前Python直譯器的主版本號。
  18. sys.getrecursionlimit() 返回Python直譯器當前支援的遞迴深度。該屬性可通過setrecursionlimit()方法重新設定。

2.1 sys.argv

“argv”即“argument value”的簡寫,是一個列表物件,其中儲存的是在命令列呼叫 Python 指令碼時提供的“命令列引數”。其中sys.argv[0]通常是指該Python程式,sys.argv[1]代表為Python程式提供的第一個引數,sys.argv[2]代表為Python程式提供的第二個引數······以此類推。這個列表中的第一個引數是被呼叫的指令碼名稱,也就是說,呼叫 Python 直譯器的“命令”(python)本身並沒有被加入這個列表當中。

舉例來說,在當前目錄下新建一個 Python 檔案example.py,其內容為:

 

import sys
print("The list of command line arguments:\n", sys.argv)

 

在命令列執行該指令碼:

$ python sys_argv_example.py

  The list of command line arguments:

  ['example.py']

2.2 sys.platform

檢視sys模組中的sys.platform屬性可以得到關於執行平臺更詳細的資訊:

 

sys.platform

 

  'linux'

2.3 sys.byteorder

“byteorder”即“位元組序”,指的是在計算機內部儲存資料時,資料的低位位元組儲存在儲存空間中的高位還是低位。

“小端儲存”時,資料的低位也儲存在儲存空間的低位地址中,此時sys.byteorder的值為“little”。如果不注意,在按地址順序列印內容的時候,可能會把小端儲存的內容打錯。當前大部分機器都是使用的小端儲存。

sys.byteorder
 'little'

而另外還存在一種儲存順序是“大端儲存”,即資料的高位位元組儲存在儲存空間的低位地址上,此時sys.byteorder的值為“big”

這種方式看起來好像很合理也很自然,因為我們一般在書面表示的時候都將低位地址寫在左邊,高位地址寫在右邊,大端儲存的順序就很符合人類的閱讀習慣。但實際上對機器而言,記憶體地址並沒有左右之分,所謂的“自然”其實並不存在。

2.4 sys.executable

該屬性是一個字串,在正常情況下,其值是當前執行的 Python 直譯器對應的可執行程式所在的絕對路徑。

比如在 Windows 上使用 Anaconda 安裝的 Python,該屬性的值就是:

 >>> sys.executable
 'E:\\Anaconda\\Anaconda\\python.exe'

2.5 sys.modules

該屬性是一個字典,包含的是各種已載入的模組的模組名到模組具體位置的對映。

通過手動修改這個字典,可以重新載入某些模組;但要注意,切記不要大意刪除了一些基本的項,否則可能會導致 Python 整個兒無法執行。

關於其具體的值,由於內容過多,就不在此給出示例了,讀者可以自行檢視。

2.6 sys.builtin_module_names

該屬性是一個字串元組,其中的元素均為當前所使用的的 Python 直譯器內建的模組名稱。

注意區別sys.modulessys.builtin_module_names——前者的關鍵字(keys)列出的是匯入的模組名,而後者則是直譯器內建的模組名。

其值示例如下:

>>> sys.builtin_module_names
('_abc', '_ast', '_bisect', '_blake2', '_codecs', '_codecs_cn', '_codecs_hk', '_codecs_iso2022', '_codecs_jp', '_codecs_kr', '_codecs_tw', '_collections', '_contextvars', '_csv', '_datetime', '_functools', '_heapq', '_imp', '_io', '_json', '_locale', '_lsprof', '_md5', '_multibytecodec', '_opcode', '_operator', '_pickle', '_random', '_sha1', '_sha256', '_sha3', '_sha512', '_signal', '_sre', '_stat', '_string', '_struct', '_symtable', '_thread', '_tracemalloc', '_warnings', '_weakref', '_winapi', 'array', 'atexit', 'audioop', 'binascii', 'builtins', 'cmath', 'errno', 'faulthandler', 'gc', 'itertools', 'marshal', 'math', 'mmap', 'msvcrt', 'nt', 'parser', 'sys', 'time', 'winreg', 'xxsubtype', 'zipimport', 'zlib')

2.7 sys.path

該屬性是一個由字串組成的列表,其中各個元素表示的是 Python 搜尋模組的路徑;在程式啟動期間被初始化。

其中第一個元素(也就是path[0])的值是最初呼叫 Python 直譯器的指令碼所在的絕對路徑;如果是在互動式環境下檢視sys.path的值,就會得到一個空字串。

互動式環境檢視屬性第一個元素:

sys.path[0]
  ''

3.例

sys獲取執行引數:

from sys import argv
#輸出argv列表的長度
print(len(argv))
#遍歷argv列表的每個元素
for arg in argv:
    print(arg)

動態修改模組載入路徑:

import sys
#動態新增g:\fk_ext路徑作為模組載入路徑
sys.path.append('g:\\fk_ext')
#載入g:\fk_ext路徑下的hello模組
import hello

  

ref:

1

2