Python標(biāo)準(zhǔn)庫(kù)之sys模塊用法詳解
1. 簡(jiǎn)介
“sys”即“system”,“系統(tǒng)”之意。該模塊提供了一些接口,用于訪問(wèn) Python 解釋器自身使用和維護(hù)的變量,同時(shí)模塊中還提供了一部分函數(shù),可以與解釋器進(jìn)行比較深度的交互。
2. 常用功能
2.1 sys.argv
“argv”即“argument value”的簡(jiǎn)寫(xiě),是一個(gè)列表對(duì)象,其中存儲(chǔ)的是在命令行調(diào)用 Python 腳本時(shí)提供的“命令行參數(shù)”。
這個(gè)列表中的第一個(gè)參數(shù)是被調(diào)用的腳本名稱(chēng),也就是說(shuō),調(diào)用 Python 解釋器的“命令”( python
)本身并沒(méi)有被加入這個(gè)列表當(dāng)中。這個(gè)地方要注意一下,因?yàn)檫@一點(diǎn)跟 C 程序的行為有所不同,C 程序讀取命令行參數(shù)是從頭開(kāi)始的。
舉例來(lái)說(shuō),在當(dāng)前目錄下新建一個(gè) Python 文件 sys_argv_example.py
,其內(nèi)容為:
import sys print("The list of command line arguments:\n", sys.argv)
在命令行運(yùn)行該腳本:
$ python sys_argv_example.py The list of command line arguments: ['example.py']
加上幾個(gè)參數(shù)試試:
$ python sys_argv_example.py arg1 arg2 arg3 The list of command line arguments: ['example.py', 'arg1', 'arg2', 'arg3']
利用好這個(gè)屬性,可以極大增強(qiáng) Python 腳本的交互性。
2.2 sys.platform
“查看 sys
模塊中的 sys.platform
屬性可以得到關(guān)于運(yùn)行平臺(tái)更詳細(xì)的信息”,這里我們就來(lái)試試:
>>> import sys >>> sys.platform 'win32'
在 Linux 上:
>>> sys.platform 'linux'
比較一下 os.name
的結(jié)果,不難發(fā)現(xiàn), sys.platform
的信息更加準(zhǔn)確。
2.3 sys.byteorder
“byteorder”即“字節(jié)序”,指的是在計(jì)算機(jī)內(nèi)部存儲(chǔ)數(shù)據(jù)時(shí),數(shù)據(jù)的低位字節(jié)存儲(chǔ)在存儲(chǔ)空間中的高位還是低位。
“小端存儲(chǔ)”時(shí),數(shù)據(jù)的低位也存儲(chǔ)在存儲(chǔ)空間的低位地址中,此時(shí) sys.byteorder
的值為 “little”
。如果不注意,在按地址順序打印內(nèi)容的時(shí)候,可能會(huì)把小端存儲(chǔ)的內(nèi)容打錯(cuò)。當(dāng)前大部分機(jī)器都是使用的小端存儲(chǔ)。
所以不出意外的話,你的機(jī)器上執(zhí)行下述交互語(yǔ)句也應(yīng)當(dāng)跟我的結(jié)果一樣:
>>> sys.byteorder 'little'
而另外還存在一種存儲(chǔ)順序是“大端存儲(chǔ)”,即數(shù)據(jù)的高位字節(jié)存儲(chǔ)在存儲(chǔ)空間的低位地址上,此時(shí) sys.byteorder
的值為 “big”
。
這種方式看起來(lái)好像很合理也很自然,因?yàn)槲覀円话阍跁?shū)面表示的時(shí)候都將低位地址寫(xiě)在左邊,高位地址寫(xiě)在右邊,大端存儲(chǔ)的順序就很符合人類(lèi)的閱讀習(xí)慣。但實(shí)際上對(duì)機(jī)器而言,內(nèi)存地址并沒(méi)有左右之分,所謂的“自然”其實(shí)并不存在。
抱歉我并沒(méi)有使用大端存儲(chǔ)的機(jī)器可以用作演示,因此只能說(shuō)如果是大端存儲(chǔ)的機(jī)器上運(yùn)行 Python,輸出結(jié)果應(yīng)該像下面這樣,也就是說(shuō)下面這個(gè)示例并非我得到的真實(shí)運(yùn)行結(jié)果,僅供參考:
>>> sys.byteorder 'big'
2.4 sys.executable
該屬性是一個(gè)字符串,在正常情況下,其值是當(dāng)前運(yùn)行的 Python 解釋器對(duì)應(yīng)的可執(zhí)行程序所在的絕對(duì)路徑。
比如在 Windows 上使用 Anaconda 安裝的 Python,該屬性的值就是:
>>> sys.executable 'E:\Anaconda\Anaconda\python.exe'
2.5 sys.modules
該屬性是一個(gè)字典,包含的是各種已加載的模塊的模塊名到模塊具體位置的映射。
通過(guò)手動(dòng)修改這個(gè)字典,可以重新加載某些模塊;但要注意,切記不要大意刪除了一些基本的項(xiàng),否則可能會(huì)導(dǎo)致 Python 整個(gè)兒無(wú)法運(yùn)行。
關(guān)于其具體的值,由于內(nèi)容過(guò)多,就不在此給出示例了,讀者可以自行查看。
2.6 sys.builtin_module_names
該屬性是一個(gè)字符串元組,其中的元素均為當(dāng)前所使用的的 Python 解釋器內(nèi)置的模塊名稱(chēng)。
注意區(qū)別 sys.modules
和 sys.builtin_module_names
——前者的關(guān)鍵字(keys)列出的是導(dǎo)入的模塊名,而后者則是解釋器內(nèi)置的模塊名。
其值示例如下:
>>> 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
A list of strings that specifies the search path for modules. Initialized from the environment variable PYTHONPATH, plus an installation-dependent default.
該屬性是一個(gè)由字符串組成的列表,其中各個(gè)元素表示的是 Python 搜索模塊的路徑;在程序啟動(dòng)期間被初始化。
其中第一個(gè)元素(也就是 path[0]
)的值是最初調(diào)用 Python 解釋器的腳本所在的絕對(duì)路徑;如果是在交互式環(huán)境下查看 sys.path
的值,就會(huì)得到一個(gè)空字符串。
命令行運(yùn)行腳本(腳本代碼見(jiàn)示例 sys_path_example.py
):
$ python sys_path_example.py The path[0] = D:\justdopython\sys_example
交互式環(huán)境查看屬性第一個(gè)元素:
>>> sys.path[0] ''
3. 進(jìn)階功能
3.1 sys.stdin
即 Python 的標(biāo)準(zhǔn)輸入通道。通過(guò)改變這個(gè)屬性為其他的類(lèi)文件(file-like)對(duì)象,可以實(shí)現(xiàn)輸入的重定向,也就是說(shuō)可以用其他內(nèi)容替換標(biāo)準(zhǔn)輸入的內(nèi)容。
所謂“標(biāo)準(zhǔn)輸入”,實(shí)際上就是通過(guò)鍵盤(pán)輸入的字符。
在示例( sys_stdin_example.py
)中,我們嘗試把這個(gè)屬性的值改為一個(gè)打開(kāi)的文件對(duì)象 hello_python.txt
,其中包含如下的內(nèi)容:
Hello Python! Just do Python, go~ Go, Go, GO!
由于 input()
使用的就是標(biāo)準(zhǔn)輸入流,因此通過(guò)修改 sys.stdin
的值,我們使用老朋友 input()
函數(shù),也可以實(shí)現(xiàn)對(duì)文件內(nèi)容的讀取,程序運(yùn)行效果如下:
$ python sys_stdin_example.py Hello Python! Just do Python, go~ Go, Go, GO!
3.2 sys.stdout
與上一個(gè)“標(biāo)準(zhǔn)輸入”類(lèi)似, sys.stdout
則是代表“標(biāo)準(zhǔn)輸出”的屬性。
通過(guò)將這個(gè)屬性的值修改為某個(gè)文件對(duì)象,可以將本來(lái)要打印到屏幕上的內(nèi)容寫(xiě)入文件。
比如運(yùn)行示例程序 sys_stdout_example.py
,用來(lái)臨時(shí)生成日志也是十分方便的:
import sys # 以附加模式打開(kāi)文件,若不存在則新建 with open("count_log.txt", 'a', encoding='utf-8') as f: sys.stdout = f for i in range(10): print("count = ", i)
3.3 sys.err
與前面兩個(gè)屬性類(lèi)似,只不過(guò)該屬性標(biāo)識(shí)的是標(biāo)準(zhǔn)錯(cuò)誤,通常也是定向到屏幕的,可以粗糙地認(rèn)為是一個(gè)輸出錯(cuò)誤信息的特殊的標(biāo)準(zhǔn)輸出流。由于性質(zhì)類(lèi)似,因此不做演示。
此外, sys
模塊中還存在幾個(gè)“私有”屬性: sys.__stdin__
, sys.__stdout__
, sys.__stderr__
。這幾個(gè)屬性中保存的就是最初定向的“標(biāo)準(zhǔn)輸入”、“標(biāo)準(zhǔn)輸出”和“標(biāo)準(zhǔn)錯(cuò)誤”流。在適當(dāng)?shù)臅r(shí)侯,我們可以借助這三個(gè)屬性將 sys.stdin
、 sys.stdout
和 sys.err
恢復(fù)為初始值。
3.4 sys.getrecursionlimit() 和 sys.setrecursionlimit()
sys.getrecursionlimit()
和 sys.setrecursionlimit()
是成對(duì)的。前者可以獲取 Python 的最大遞歸數(shù)目,后者則可以設(shè)置最大遞歸數(shù)目。因?yàn)槌鯇W(xué)階段很少用到,因此只做了解。
3.5 sys.getrefcount()
sys.getrefcount()函數(shù)其返回值是 Python 中某個(gè)對(duì)象被引用的次數(shù)。
3.6 sys.getsizeof()
這個(gè)函數(shù)的作用與 C 語(yǔ)言中的 sizeof
運(yùn)算符類(lèi)似,返回的是作用對(duì)象所占用的字節(jié)數(shù)。
比如我們就可以看看一個(gè)整型對(duì)象 1
在內(nèi)存中的大?。?/p>
>>> sys.getsizeof(1) 28
注意,在 Python 中,某類(lèi)對(duì)象的大小并非一成不變的:
>>> sys.getsizeof(2**30-1) 28 >>> sys.getsizeof(2**30) 32
3.7 sys.int_info 和 sys.float_info
這兩個(gè)屬性分別給出了 Python 中兩個(gè)重要的數(shù)據(jù)類(lèi)型的相關(guān)信息。
其中 sys.int_info
的值為:
>>> sys.int_info sys.int_info(bits_per_digit=30, sizeof_digit=4)
在文檔中的解釋為:
屬性 | 解釋 |
---|---|
bits_per_digit | number of bits held in each digit. Python integers are stored internally in base 2**int_info.bits_per_digit |
sizeof_digit | size in bytes of the C type used to represent a digit |
指的是 Python 以 2 的 sys.int_info.bits_per_digit
次方為基來(lái)表示整數(shù),也就是說(shuō)它是“2 的 sys.int_info.bits_per_digit
次方進(jìn)制”的數(shù)。這樣的數(shù)每一個(gè)為都用 C 類(lèi)中的 4 個(gè)字節(jié)來(lái)存儲(chǔ)。
換句話說(shuō),每“進(jìn) 1 位”(即整數(shù)值增加2 的 sys.int_info.bits_per_digit
次方),就需要多分配 4 個(gè)字節(jié)用以保存某個(gè)整數(shù)。
因此在 sys.getsizeof()
的示例中,我們可以看到 2**30-1
和 2**30
之間,雖然本身只差了 1,但是所占的字節(jié)后者卻比前者多了 4。
而 sys.float_info
的值則是:
>>> sys.float_info sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
其中各項(xiàng)具體的含義就不在這里繼續(xù)展開(kāi)了。
4. 一個(gè)有趣的功能
接下來(lái)讓我們放松一下。
每次打開(kāi) Python 的交互式界面,我們都會(huì)看到一個(gè)提示符 >>>
。不知道你有沒(méi)有想過(guò)要把這個(gè)東西換成另外的什么呢?
反正我沒(méi)想過(guò)哈哈——至少在文檔中看到這兩個(gè)屬性之前,我確實(shí)沒(méi)有想過(guò)。哪兩個(gè)屬性呢?
就這倆貨: sys.ps1
和 sys.ps2
所謂“ps”,應(yīng)當(dāng)是“prompts”的簡(jiǎn)寫(xiě),即“提示符”。
這兩個(gè)屬性中, sys.ps1
代表的是一級(jí)提示符,也就是進(jìn)入 Python 交互界面之后就會(huì)出現(xiàn)的那一個(gè) >>>
;而第二個(gè) sys.ps2
則是二級(jí)提示符,是在同一級(jí)內(nèi)容沒(méi)有輸入完,換行之后新行行首的提示符 ...
。當(dāng)然,兩個(gè)屬性都是字符串。
好了,知道怎么回事兒就好辦了。
現(xiàn)在我們就來(lái)一個(gè):
>>> sys.ps1 = "justdopython " justdopython li = [1,2,3] justdopython li[0] 1 justdopython
提示符已經(jīng)被改變了,當(dāng)然,有點(diǎn)長(zhǎng),不大美觀哈哈。
咱們換一下:
justdopython sys.ps1 = "ILoveYou: " ILoveYou: print("你可真是個(gè)小機(jī)靈鬼兒!") 你可真是個(gè)小機(jī)靈鬼兒! ILoveYou:
有點(diǎn)兒意思吧?
注意不要忘了在字符串最后加個(gè)空格,否則提示符就會(huì)和你輸入的內(nèi)容混雜在一起了,會(huì)十分難看的喲~
以上就是Python標(biāo)準(zhǔn)庫(kù)之sys模塊詳解的詳細(xì)內(nèi)容,更多關(guān)于Python sys模塊的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Flask利用自定義接口實(shí)現(xiàn)mock應(yīng)用詳解
后端接口已提供,前端需要依賴(lài)后端接口返回的數(shù)據(jù)進(jìn)行前端頁(yè)面的開(kāi)發(fā),如何配合前端?這篇就來(lái)介紹一下Flask如何利用自定義接口實(shí)現(xiàn)mock應(yīng)用,需要的可以參考一下2023-03-03Python自動(dòng)化測(cè)試pytest中fixtureAPI簡(jiǎn)單說(shuō)明
這篇文章主要為大家介紹了Python自動(dòng)化測(cè)試pytest中fixtureAPI的簡(jiǎn)單說(shuō)明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10Python實(shí)戰(zhàn)購(gòu)物車(chē)項(xiàng)目的實(shí)現(xiàn)參考
今天小編就為大家分享一篇關(guān)于Python實(shí)戰(zhàn)購(gòu)物車(chē)項(xiàng)目的實(shí)現(xiàn)參考,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02Keras搭建Mask?R-CNN實(shí)例分割平臺(tái)實(shí)現(xiàn)源碼
這篇文章主要為大家介紹了Keras搭建Mask?R-CNN實(shí)例分割平臺(tái)實(shí)現(xiàn)源碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05python中cv2.imread()和Image.open()的區(qū)別和聯(lián)系詳解
image.open和cv2.imread都是Python中用于讀取圖像文件的函數(shù),但是它們之間有一些區(qū)別,這篇文章主要給大家介紹了關(guān)于python中cv2.imread()和Image.open()的區(qū)別和聯(lián)系,需要的朋友可以參考下2024-07-07python中reversed與reverse的區(qū)別解析
reverse()是python中列表的一個(gè)內(nèi)置方法(在字典、字符串和元組中沒(méi)有這個(gè)內(nèi)置方法),用于列表中數(shù)據(jù)的反轉(zhuǎn),這篇文章主要介紹了python中reversed與reverse的區(qū)別,需要的朋友可以參考下2023-03-03python使用urllib2提交http post請(qǐng)求的方法
這篇文章主要介紹了python使用urllib2提交http post請(qǐng)求的方法,涉及Python使用urllib2模塊的相關(guān)技巧,需要的朋友可以參考下2015-05-05