sys --- 系統(tǒng)相關(guān)的參數(shù)和函數(shù)?


該模塊提供了一些變量和函數(shù)。這些變量可能被解釋器使用,也可能由解釋器提供。這些函數(shù)會(huì)影響解釋器。本模塊總是可用的。

sys.abiflags?

在POSIX系統(tǒng)上,以標(biāo)準(zhǔn)的 configure 腳本構(gòu)建的 Python 中,這個(gè)變量會(huì)包含 PEP 3149 中定義的ABI標(biāo)簽。

在 3.8 版更改: 默認(rèn)的 flags 變?yōu)榱丝兆址ㄓ糜?pymalloc 的 m 旗標(biāo)已經(jīng)移除)

3.2 新版功能.

sys.addaudithook(hook)?

將可調(diào)用對(duì)象 hook 附加到當(dāng)前(子)解釋器的活動(dòng)的審計(jì)鉤子列表中。

當(dāng)通過 sys.audit() 函數(shù)引發(fā)審計(jì)事件時(shí),每個(gè)鉤子將按照其被加入的先后順序被調(diào)用,調(diào)用時(shí)會(huì)傳入事件名稱和參數(shù)元組。 由 PySys_AddAuditHook() 添加的原生鉤子會(huì)先被調(diào)用,然后是當(dāng)前(子)解釋器中添加的鉤子。 接下來這些鉤子會(huì)記錄事件,引發(fā)異常來中止操作,或是完全終止進(jìn)程。

調(diào)用 sys.addaudithook() 時(shí)它自身將引發(fā)一個(gè)名為 sys.addaudithook 的審計(jì)事件且不附帶參數(shù)。 如果任何現(xiàn)有的鉤子引發(fā)了派生自 RuntimeError 的異常,則新的鉤子不會(huì)被添加并且該異常會(huì)被抑制。 其結(jié)果就是,調(diào)用者無法確保他們的鉤子已經(jīng)被添加,除非他們控制了全部現(xiàn)有的鉤子。

請(qǐng)參閱 審計(jì)事件表 以獲取由 CPython 引發(fā)的所有事件,并參閱 PEP 578 了解最初的設(shè)計(jì)討論。

3.8 新版功能.

在 3.8.1 版更改: 派生自 Exception (而非 RuntimeError )的異常不會(huì)被抑制。

CPython implementation detail: 啟用跟蹤時(shí)(參閱 settrace() ),僅當(dāng)可調(diào)用對(duì)象(鉤子)的 __cantrace__ 成員設(shè)置為 true 時(shí),才會(huì)跟蹤該鉤子。否則,跟蹤功能將跳過該鉤子。

sys.argv?

一個(gè)列表,其中包含了被傳遞給 Python 腳本的命令行參數(shù)。 argv[0] 為腳本的名稱(是否是完整的路徑名取決于操作系統(tǒng))。如果是通過 Python 解釋器的命令行參數(shù) -c 來執(zhí)行的, argv[0] 會(huì)被設(shè)置成字符串 '-c' 。如果沒有腳本名被傳遞給 Python 解釋器, argv[0] 為空字符串。

為了遍歷標(biāo)準(zhǔn)輸入,或者通過命令行傳遞的文件列表,參照 fileinput 模塊

另請(qǐng)參閱 sys.orig_argv

備注

在 Unix 上,系統(tǒng)傳遞的命令行參數(shù)是字節(jié)類型的。Python 使用文件系統(tǒng)編碼和 "surrogateescape" 錯(cuò)誤處理方案對(duì)它們進(jìn)行解碼。當(dāng)需要原始字節(jié)時(shí),可以通過 [os.fsencode(arg) for arg in sys.argv] 來獲取。

sys.audit(event, *args)?

引發(fā)一個(gè)審計(jì)事件并觸發(fā)任何激活的審計(jì)鉤子。 event 是一個(gè)用于標(biāo)識(shí)事件的字符串,args 會(huì)包含有關(guān)事件的更多信息的可選參數(shù)。 特定事件的參數(shù)的數(shù)量和類型會(huì)被視為是公有的穩(wěn)定 API 且不應(yīng)當(dāng)在版本之間進(jìn)行修改。

例如,有一個(gè)審計(jì)事件的名稱為 os.chdir。 此事件具有一個(gè)名為 path 的參數(shù),該參數(shù)將包含所請(qǐng)求的新工作目錄。

sys.audit() 將調(diào)用現(xiàn)有的審計(jì)鉤子,傳入事件名稱和參數(shù),并將重新引發(fā)來自任何鉤子的第一個(gè)異常。 通常來說,如果有一個(gè)異常被引發(fā),則它不應(yīng)當(dāng)被處理且其進(jìn)程應(yīng)當(dāng)被盡可能快地終止。 這將允許鉤子實(shí)現(xiàn)來決定對(duì)特定事件要如何反應(yīng):它們可以只是將事件寫入日志或是通過引發(fā)異常來中止操作。

鉤子程序由 sys.addaudithook()PySys_AddAuditHook() 函數(shù)添加。

與本函數(shù)相等效的原生函數(shù)是 PySys_Audit(),應(yīng)盡量使用原生函數(shù)。

參閱 審計(jì)事件表 以獲取 CPython 定義的所有審計(jì)事件。

3.8 新版功能.

sys.base_exec_prefix?

site.py 運(yùn)行之前, Python 啟動(dòng)的時(shí)候被設(shè)置為跟 exec_prefix 同樣的值。如果不是運(yùn)行在 虛擬環(huán)境 中,兩個(gè)值會(huì)保持相同;如果 site.py 發(fā)現(xiàn)處于一個(gè)虛擬環(huán)境中, prefixexec_prefix 將會(huì)指向虛擬環(huán)境。然而 base_prefixbase_exec_prefix 將仍然會(huì)指向基礎(chǔ)的 Python 環(huán)境(用來創(chuàng)建虛擬環(huán)境的 Python 環(huán)境)

3.3 新版功能.

sys.base_prefix?

site.py 運(yùn)行之前, Python 啟動(dòng)的時(shí)候被設(shè)置為跟 prefix 同樣的值。如果不是運(yùn)行在 虛擬環(huán)境 中, 兩個(gè)值會(huì)保持相同;如果 site.py 發(fā)現(xiàn)處于一個(gè)虛擬環(huán)境中, prefixexec_prefix 將會(huì)指向虛擬環(huán)境。然而 base_prefixbase_exec_prefix 將仍然會(huì)指向基礎(chǔ)的 Python 環(huán)境(用來創(chuàng)建虛擬環(huán)境的 Python 環(huán)境)

3.3 新版功能.

sys.byteorder?

本地字節(jié)順序的指示符。在大端序(最高有效位優(yōu)先)操作系統(tǒng)上值為 'big' ,在小端序(最低有效位優(yōu)先)操作系統(tǒng)上為 'little' 。

sys.builtin_module_names?

一個(gè)包含所有被編譯進(jìn) Python 解釋器的模塊的名稱的字符串元組。 (此信息無法通過任何其他辦法獲取 --- modules.keys() 僅會(huì)列出導(dǎo)入的模塊。)

另請(qǐng)參閱 sys.stdlib_module_names 列表。

sys.call_tracing(func, args)?

在啟用跟蹤時(shí)調(diào)用 func(*args) 來保存跟蹤狀態(tài),然后恢復(fù)跟蹤狀態(tài)。這將從檢查點(diǎn)的調(diào)試器調(diào)用,以便遞歸地調(diào)試其他的一些代碼。

sys.copyright?

一個(gè)字符串,包含了 Python 解釋器有關(guān)的版權(quán)信息

sys._clear_type_cache()?

清除內(nèi)部的類型緩存。類型緩存是為了加速查找方法和屬性的。在調(diào)試引用泄漏的時(shí)候調(diào)用這個(gè)函數(shù) 只會(huì) 清除不必要的引用。

這個(gè)函數(shù)應(yīng)該只在內(nèi)部為了一些特定的目的使用。

sys._current_frames()?

返回一個(gè)字典,存放著每個(gè)線程的標(biāo)識(shí)符與(調(diào)用本函數(shù)時(shí))該線程棧頂?shù)膸ó?dāng)前活動(dòng)的幀)之間的映射。注意 traceback 模塊中的函數(shù)可以在給定某一幀的情況下構(gòu)建調(diào)用堆棧。

這對(duì)于調(diào)試死鎖最有用:本函數(shù)不需要死鎖線程的配合,并且只要這些線程的調(diào)用棧保持死鎖,它們就是凍結(jié)的。在調(diào)用本代碼來檢查棧頂?shù)膸哪且豢?,非死鎖線程返回的幀可能與該線程當(dāng)前活動(dòng)的幀沒有任何關(guān)系。

這個(gè)函數(shù)應(yīng)該只在內(nèi)部為了一些特定的目的使用。

引發(fā)一個(gè) 審計(jì)事件 sys._current_frames,沒有附帶參數(shù)。

sys._current_exceptions()?

返回一個(gè)字典,存放著每個(gè)線程的標(biāo)識(shí)與調(diào)用此函數(shù)時(shí)該線程當(dāng)前活動(dòng)幀的棧頂異常之間的映射。 如果某個(gè)線程當(dāng)前未在處理異常,它將不被包括在結(jié)果字典中。

這對(duì)于靜態(tài)性能分析來說最為有用。

這個(gè)函數(shù)應(yīng)該只在內(nèi)部為了一些特定的目的使用。

引發(fā)一個(gè) 審計(jì)事件 sys._current_exceptions,不附帶任何參數(shù)。

sys.breakpointhook()?

本鉤子函數(shù)由內(nèi)建函數(shù) breakpoint() 調(diào)用。默認(rèn)情況下,它將進(jìn)入 pdb 調(diào)試器,但可以將其改為任何其他函數(shù),以選擇使用哪個(gè)調(diào)試器。

該函數(shù)的特征取決于其調(diào)用的函數(shù)。例如,默認(rèn)綁定(即 pdb.set_trace() )不要求提供參數(shù),但可以將綁定換成要求提供附加參數(shù)(位置參數(shù)/關(guān)鍵字參數(shù))的函數(shù)。內(nèi)建函數(shù) breakpoint() 直接將其 *args**kws 傳入。breakpointhooks() 返回的所有內(nèi)容都會(huì)從 breakpoint() 返回。

默認(rèn)的實(shí)現(xiàn)首先會(huì)查詢環(huán)境變量 PYTHONBREAKPOINT。如果將該變量設(shè)置為 "0",則本函數(shù)立即返回,表示在斷點(diǎn)處無操作。如果未設(shè)置該環(huán)境變量或?qū)⑵湓O(shè)置為空字符串,則調(diào)用 pdb.set_trace()。否則,此變量應(yīng)指定要運(yùn)行的函數(shù),指定函數(shù)時(shí)應(yīng)使用 Python 的點(diǎn)導(dǎo)入命名法,如 package.subpackage.module.function。這種情況下將導(dǎo)入 package.subpackage.module,且導(dǎo)入的模塊必須有一個(gè)名為 function() 的可調(diào)用對(duì)象。該可調(diào)用對(duì)象會(huì)運(yùn)行,*args**kws 會(huì)傳入,且無論 function() 返回什么,sys.breakpointhook() 都將返回到內(nèi)建函數(shù) breakpoint()

請(qǐng)注意,如果在導(dǎo)入 PYTHONBREAKPOINT 指定的可調(diào)用對(duì)象時(shí)出錯(cuò),則將報(bào)告一個(gè) RuntimeWarning 并忽略斷點(diǎn)。

另請(qǐng)注意,如果以編程方式覆蓋 sys.breakpointhook(),則 不會(huì) 查詢 PYTHONBREAKPOINT

3.7 新版功能.

sys._debugmallocstats()?

將有關(guān) CPython 內(nèi)存分配器狀態(tài)的底層的信息打印至 stderr。

如果 Python 是 以調(diào)試模式編譯的 <debug-build> (configure --with-pydebug option),它還會(huì)執(zhí)行一些消耗性能的內(nèi)部一致性檢查。

3.3 新版功能.

CPython implementation detail: 本函數(shù)僅限 CPython。此處沒有定義確切的輸出格式,且可能會(huì)更改。

sys.dllhandle?

指向 Python DLL 句柄的整數(shù)。

可用性: Windows。

sys.displayhook(value)?

如果 value 不是 None,則本函數(shù)會(huì)將 repr(value) 打印至 sys.stdout,并將 value 保存在 builtins._ 中。如果 repr(value) 無法用 sys.stdout.errors 錯(cuò)誤處理方案(可能為 'strict' )編碼為 sys.stdout.encoding,則用 'backslashreplace' 錯(cuò)誤處理方案將其編碼為 sys.stdout.encoding

在交互式 Python 會(huì)話中運(yùn)行 expression 產(chǎn)生結(jié)果后,將在結(jié)果上調(diào)用 sys.displayhook。若要自定義這些 value 的顯示,可以將 sys.displayhook 指定為另一個(gè)單參數(shù)函數(shù)。

偽代碼:

def displayhook(value):
    if value is None:
        return
    # Set '_' to None to avoid recursion
    builtins._ = None
    text = repr(value)
    try:
        sys.stdout.write(text)
    except UnicodeEncodeError:
        bytes = text.encode(sys.stdout.encoding, 'backslashreplace')
        if hasattr(sys.stdout, 'buffer'):
            sys.stdout.buffer.write(bytes)
        else:
            text = bytes.decode(sys.stdout.encoding, 'strict')
            sys.stdout.write(text)
    sys.stdout.write("\n")
    builtins._ = value

在 3.2 版更改: 在發(fā)生 UnicodeEncodeError 時(shí)使用 'backslashreplace' 錯(cuò)誤處理方案。

sys.dont_write_bytecode?

如果該值為 true,則 Python 在導(dǎo)入源碼模塊時(shí)將不會(huì)嘗試寫入 .pyc 文件。該值會(huì)被初始化為 TrueFalse,依據(jù)是 -B 命令行選項(xiàng)和 PYTHONDONTWRITEBYTECODE 環(huán)境變量,可以自行設(shè)置該值,來控制是否生成字節(jié)碼文件。

sys._emscripten_info?

A named tuple holding information about the environment on the wasm32-emscripten platform. The named tuple is provisional and may change in the future.

屬性

說明

emscripten_version

Emscripten version as tuple of ints (major, minor, micro), e.g. (3, 1, 8).

runtime

Runtime string, e.g. browser user agent, 'Node.js v14.18.2', or 'UNKNOWN'.

pthreads

True if Python is compiled with Emscripten pthreads support.

shared_memory

True if Python is compiled with shared memory support.

Availability: WebAssembly Emscripten platform (wasm32-emscripten).

3.11 新版功能.

sys.pycache_prefix?

如果將該值設(shè)為某個(gè)目錄(不是 None ),Python 會(huì)將字節(jié)碼緩存文件 .pyc 寫入到以該目錄為根的并行目錄樹中(并從中讀?。?,而不是在源碼樹中的 __pycache__ 目錄下讀寫。源碼樹中所有的 __pycache__ 目錄都將被忽略,并將在 pycache prefix 內(nèi)寫入新的 .pyc 文件。因此,如果使用 compileall 作為預(yù)構(gòu)建步驟,則必須確保預(yù)構(gòu)建時(shí)使用的 pycache prefix (如果有)與將來運(yùn)行的時(shí)候相同。

相對(duì)路徑將解釋為相對(duì)于當(dāng)前工作目錄。

該值的初值設(shè)置,依據(jù) -X pycache_prefix=PATH 命令行選項(xiàng)或 PYTHONPYCACHEPREFIX 環(huán)境變量的值(命令行優(yōu)先)。如果兩者均未設(shè)置,則為 None。

3.8 新版功能.

sys.excepthook(type, value, traceback)?

本函數(shù)會(huì)將所給的回溯和異常輸出到 sys.stderr 中。

當(dāng)拋出一個(gè)異常,且未被捕獲時(shí),解釋器將調(diào)用 sys.excepthook 并帶有三個(gè)參數(shù):異常類、異常實(shí)例和一個(gè)回溯對(duì)象。在交互式會(huì)話中,這會(huì)在控制權(quán)返回到提示符之前發(fā)生。在 Python 程序中,這會(huì)在程序退出之前發(fā)生。如果要自定義此類頂級(jí)異常的處理過程,可以將另一個(gè) 3 個(gè)參數(shù)的函數(shù)賦給 sys.excepthook。

引發(fā)一個(gè) 審計(jì)事件 sys.excepthook,附帶參數(shù) hook, type, value, traceback。

參見

sys.unraisablehook() 函數(shù)處理無法拋出的異常,threading.excepthook() 函數(shù)處理 threading.Thread.run() 拋出的異常。

sys.__breakpointhook__?
sys.__displayhook__?
sys.__excepthook__?
sys.__unraisablehook__?

程序開始時(shí),這些對(duì)象存有 breakpointhookdisplayhook、excepthookunraisablehook 的初始值。保存它們是為了可以在 breakpointhook、displayhookexcepthook、unraisablehook 被破壞或被替換時(shí)恢復(fù)它們。

3.7 新版功能: __breakpointhook__

3.8 新版功能: __unraisablehook__

sys.exception()?

This function, when called while an exception handler is executing (such as an except or except* clause), returns the exception instance that was caught by this handler. When exception handlers are nested within one another, only the exception handled by the innermost handler is accessible.

If no exception handler is executing, this function returns None.

3.11 新版功能.

sys.exc_info()?

This function returns the old-style representation of the handled exception. If an exception e is currently handled (so exception() would return e), exc_info() returns the tuple (type(e), e, e.__traceback__). That is, a tuple containing the type of the exception (a subclass of BaseException), the exception itself, and a traceback object which typically encapsulates the call stack at the point where the exception last occurred.

If no exception is being handled anywhere on the stack, this function return a tuple containing three None values.

在 3.11 版更改: The type and traceback fields are now derived from the value (the exception instance), so when an exception is modified while it is being handled, the changes are reflected in the results of subsequent calls to exc_info().

sys.exec_prefix?

一個(gè)字符串,提供特定域的目錄前綴,該目錄中安裝了與平臺(tái)相關(guān)的 Python 文件,默認(rèn)也是 '/usr/local'。該目錄前綴可以在構(gòu)建時(shí)使用 configure 腳本的 --exec-prefix 參數(shù)進(jìn)行設(shè)置。具體而言,所有配置文件(如 pyconfig.h 頭文件)都安裝在目錄 exec_prefix/lib/pythonX.Y/config 中,共享庫模塊安裝在 exec_prefix/lib/pythonX.Y/lib-dynload 中,其中 X.Y 是 Python 的版本號(hào),如 3.2。

備注

如果在一個(gè) 虛擬環(huán)境 中,那么該值將在 site.py 中被修改,指向虛擬環(huán)境。Python 安裝位置仍然可以用 base_exec_prefix 來獲取。

sys.executable?

一個(gè)字符串,提供 Python 解釋器的可執(zhí)行二進(jìn)制文件的絕對(duì)路徑,僅在部分系統(tǒng)中此值有意義。如果 Python 無法獲取其可執(zhí)行文件的真實(shí)路徑,則 sys.executable 將為空字符串或 None

sys.exit([arg])?

Raise a SystemExit exception, signaling an intention to exit the interpreter.

可選參數(shù) arg 可以是表示退出狀態(tài)的整數(shù)(默認(rèn)為 0),也可以是其他類型的對(duì)象。如果它是整數(shù),則 shell 等將 0 視為“成功終止”,非零值視為“異常終止”。大多數(shù)系統(tǒng)要求該值的范圍是 0--127,否則會(huì)產(chǎn)生不確定的結(jié)果。某些系統(tǒng)為退出代碼約定了特定的含義,但通常尚不完善;Unix 程序通常用 2 表示命令行語法錯(cuò)誤,用 1 表示所有其他類型的錯(cuò)誤。傳入其他類型的對(duì)象,如果傳入 None 等同于傳入 0,如果傳入其他對(duì)象則將其打印至 stderr,且退出代碼為 1。特別地,sys.exit("some error message") 可以在發(fā)生錯(cuò)誤時(shí)快速退出程序。

Since exit() ultimately "only" raises an exception, it will only exit the process when called from the main thread, and the exception is not intercepted. Cleanup actions specified by finally clauses of try statements are honored, and it is possible to intercept the exit attempt at an outer level.

在 3.6 版更改: 在 Python 解釋器捕獲 SystemExit 后,如果在清理中發(fā)生錯(cuò)誤(如清除標(biāo)準(zhǔn)流中的緩沖數(shù)據(jù)時(shí)出錯(cuò)),則退出狀態(tài)碼將變?yōu)?120。

sys.flags?

具名元組 flags 含有命令行標(biāo)志的狀態(tài)。這些屬性是只讀的。

attribute -- 屬性

標(biāo)志

debug

-d

inspect

-i

interactive

-i

isolated

-I

optimize

-O-OO

dont_write_bytecode

-B

no_user_site

-s

no_site

-S

ignore_environment

-E

verbose

-v

bytes_warning

-b

quiet

-q

hash_randomization

-R

dev_mode

-X dev (Python 開發(fā)模式)

utf8_mode

-X utf8

safe_path

-P

在 3.2 版更改: 為新的 -q 標(biāo)志添加了 quiet 屬性

3.2.3 新版功能: hash_randomization 屬性

在 3.3 版更改: 刪除了過時(shí)的 division_warning 屬性

在 3.4 版更改: -I isolated 標(biāo)志添加了 isolated 屬性。

在 3.7 版更改: 為新的 Python 開發(fā)模式 添加了 dev_mode 屬性,為新的 -X utf8 標(biāo)志添加了 utf8_mode 屬性。

在 3.11 版更改: Added the safe_path attribute for -P option.

sys.float_info?

一個(gè) 具名元組,存有浮點(diǎn)型的相關(guān)信息。它包含的是關(guān)于精度和內(nèi)部表示的底層信息。這些值與標(biāo)準(zhǔn)頭文件 float.h 中為 C 語言定義的各種浮點(diǎn)常量對(duì)應(yīng),詳情請(qǐng)參閱 1999 ISO/IEC C 標(biāo)準(zhǔn) [C99] 的 5.2.4.2.2 節(jié),'Characteristics of floating types(浮點(diǎn)型的特性)'。

attribute -- 屬性

float.h 宏

說明

epsilon

DBL_EPSILON

大于 1.0 的最小值和 1.0 之間的差,表示為浮點(diǎn)數(shù)

另請(qǐng)參閱 math.ulp()。

dig

DBL_DIG

浮點(diǎn)數(shù)可以真實(shí)表示的最大十進(jìn)制數(shù)字;見下文

mant_dig

DBL_MANT_DIG

浮點(diǎn)數(shù)精度:radix 基數(shù)下的浮點(diǎn)數(shù)有效位數(shù)

max

DBL_MAX

可表示的最大正浮點(diǎn)數(shù)(非無窮)

max_exp

DBL_MAX_EXP

使得 radix**(e-1) 是可表示的浮點(diǎn)數(shù)(非無窮)的最大整數(shù) e

max_10_exp

DBL_MAX_10_EXP

使得 10**e 在可表示的浮點(diǎn)數(shù)(非無窮)范圍內(nèi)的最大整數(shù) e

min

DBL_MIN

可表示的最小正 規(guī)格化 浮點(diǎn)數(shù)

使用 math.ulp(0.0) 獲取可表示的最小正 非規(guī)格化 浮點(diǎn)數(shù)

min_exp

DBL_MIN_EXP

使得 radix**(e-1) 是規(guī)格化浮點(diǎn)數(shù)的最小整數(shù) e

min_10_exp

DBL_MIN_10_EXP

使得 10**e 是規(guī)格化浮點(diǎn)數(shù)的最小整數(shù) e

radix

FLT_RADIX

指數(shù)表示法中采用的基數(shù)

rounds

FLT_ROUNDS

整數(shù)常數(shù),表示算術(shù)運(yùn)算中的舍入方式。它反映了解釋器啟動(dòng)時(shí)系統(tǒng)的 FLT_ROUNDS 宏的值。關(guān)于可能的值及其含義的說明,請(qǐng)參閱 C99 標(biāo)準(zhǔn) 5.2.4.2.2 節(jié)。

關(guān)于 sys.float_info.dig 屬性的進(jìn)一步說明。如果 s 是表示十進(jìn)制數(shù)的字符串,而該數(shù)最多有 sys.float_info.dig 位有效數(shù)字,則將 s 轉(zhuǎn)換為 float 再轉(zhuǎn)回去將恢復(fù)原先相同十進(jìn)制值的字符串:

>>>
>>> import sys
>>> sys.float_info.dig
15
>>> s = '3.14159265358979'    # decimal string with 15 significant digits
>>> format(float(s), '.15g')  # convert to float and back -> same value
'3.14159265358979'

但是對(duì)于超過 sys.float_info.dig 位有效數(shù)字的字符串,轉(zhuǎn)換前后并非總是相同:

>>>
>>> s = '9876543211234567'    # 16 significant digits is too many!
>>> format(float(s), '.16g')  # conversion changes value
'9876543211234568'
sys.float_repr_style?

一個(gè)字符串,反映 repr() 函數(shù)在浮點(diǎn)數(shù)上的行為。如果該字符串是 'short',那么對(duì)于(非無窮的)浮點(diǎn)數(shù) x,repr(x) 將會(huì)生成一個(gè)短字符串,滿足 float(repr(x)) == x 的特性。這是 Python 3.1 及更高版本中的常見行為。否則 float_repr_style 的值將是 'legacy',此時(shí) repr(x) 的行為方式將與 Python 3.1 之前的版本相同。

3.1 新版功能.

sys.getallocatedblocks()?

返回解釋器當(dāng)前已分配的內(nèi)存塊數(shù),無論它們大小如何。本函數(shù)主要用于跟蹤和調(diào)試內(nèi)存泄漏。因?yàn)榻忉屍饔袃?nèi)部緩存,所以不同調(diào)用之間結(jié)果會(huì)變化??赡苄枰{(diào)用 _clear_type_cache()gc.collect() 使結(jié)果更容易預(yù)測(cè)。

如果當(dāng)前 Python 構(gòu)建或?qū)崿F(xiàn)無法合理地計(jì)算此信息,允許 getallocatedblocks() 返回 0。

3.4 新版功能.

sys.getandroidapilevel()?

返回一個(gè)整數(shù),表示 Android 構(gòu)建時(shí) API 版本。

可用性:Android。

3.7 新版功能.

sys.getdefaultencoding()?

返回當(dāng)前 Unicode 實(shí)現(xiàn)所使用的默認(rèn)字符串編碼名稱。

sys.getdlopenflags()?

返回當(dāng)前 dlopen() 調(diào)用所使用的標(biāo)志位的值。標(biāo)志值對(duì)應(yīng)的符號(hào)名稱可以在 os 模塊中找到(形如 RTLD_xxx 的常量,如 os.RTLD_LAZY )。

可用性: Unix。

sys.getfilesystemencoding()?

獲取 文件系統(tǒng)編碼格式: 與 文件系統(tǒng)錯(cuò)誤處理句柄 一起使用以便在 Unicode 文件名和字節(jié)文件名之間進(jìn)行轉(zhuǎn)換。 文件系統(tǒng)錯(cuò)誤處理句柄是由 getfilesystemencoding() 來返回的。

為獲得最佳兼容性,在任何時(shí)候都應(yīng)使用 str 來表示文件名,盡管使用 bytes 來表示文件名也是受支持的。 接受還返回文件名的函數(shù)應(yīng)當(dāng)支持 str 或 bytes 并在內(nèi)部將其轉(zhuǎn)換為系統(tǒng)首選的表示形式。

應(yīng)使用 os.fsencode()os.fsdecode() 來保證所采用的編碼和錯(cuò)誤處理方案都是正確的。

filesystem encoding and error handler 是在 Python 啟動(dòng)時(shí)通過 PyConfig_Read() 函數(shù)來配置的:請(qǐng)參閱 PyConfigfilesystem_encodingfilesystem_errors 等成員。

在 3.2 版更改: getfilesystemencoding() 的結(jié)果將不再有可能是 None。

在 3.6 版更改: Windows 不再保證會(huì)返回 'mbcs'。詳情請(qǐng)參閱 PEP 529_enablelegacywindowsfsencoding()。

在 3.7 版更改: 返回 'utf-8',如果啟用了 Python UTF-8 模式 的話。

sys.getfilesystemencodeerrors()?

獲取 文件系統(tǒng)錯(cuò)誤處理句柄: 該錯(cuò)誤處理句柄與 文件系統(tǒng)編碼格式 一起使用以便在 Unicode 文件名和字節(jié)文件名之間進(jìn)程轉(zhuǎn)換。 文件系統(tǒng)編碼格式是由 getfilesystemencoding() 來返回的。

應(yīng)使用 os.fsencode()os.fsdecode() 來保證所采用的編碼和錯(cuò)誤處理方案都是正確的。

filesystem encoding and error handler 是在 Python 啟動(dòng)時(shí)通過 PyConfig_Read() 函數(shù)來配置的:請(qǐng)參閱 PyConfigfilesystem_encodingfilesystem_errors 等成員。

3.6 新版功能.

sys.getrefcount(object)?

返回 object 的引用計(jì)數(shù)。返回的計(jì)數(shù)通常比預(yù)期的多一,因?yàn)樗俗鳛?getrefcount() 參數(shù)的這一次(臨時(shí))引用。

sys.getrecursionlimit()?

返回當(dāng)前的遞歸限制值,即 Python 解釋器堆棧的最大深度。此限制可防止無限遞歸導(dǎo)致的 C 堆棧溢出和 Python 崩潰。該值可以通過 setrecursionlimit() 設(shè)置。

sys.getsizeof(object[, default])?

返回對(duì)象的大?。ㄒ宰止?jié)為單位)。該對(duì)象可以是任何類型。所有內(nèi)建對(duì)象返回的結(jié)果都是正確的,但對(duì)于第三方擴(kuò)展不一定正確,因?yàn)檫@與具體實(shí)現(xiàn)有關(guān)。

只計(jì)算直接分配給對(duì)象的內(nèi)存消耗,不計(jì)算它所引用的對(duì)象的內(nèi)存消耗。

對(duì)象不提供計(jì)算大小的方法時(shí),如果傳入過 default 則返回它,否則拋出 TypeError 異常。

如果對(duì)象由垃圾回收器管理,則 getsizeof() 將調(diào)用對(duì)象的 __sizeof__ 方法,并在上層添加額外的垃圾回收器。

可以參考 recursive sizeof recipe 中的示例,關(guān)于遞歸調(diào)用 getsizeof() 來得到各個(gè)容器及其所有內(nèi)容物的大小。

sys.getswitchinterval()?

返回解釋器的“線程切換間隔時(shí)間”,請(qǐng)參閱 setswitchinterval()

3.2 新版功能.

sys._getframe([depth])?

返回來自調(diào)用棧的一個(gè)幀對(duì)象。如果傳入可選整數(shù) depth,則返回從棧頂往下相應(yīng)調(diào)用層數(shù)的幀對(duì)象。如果該數(shù)比調(diào)用棧更深,則拋出 ValueError。depth 的默認(rèn)值是 0,返回調(diào)用棧頂部的幀。

引發(fā)一個(gè) 審計(jì)事件 sys._getframe,沒有附帶參數(shù)。

CPython implementation detail: 這個(gè)函數(shù)應(yīng)該只在內(nèi)部為了一些特定的目的使用。不保證它在所有 Python 實(shí)現(xiàn)中都存在。

sys.getprofile()?

返回由 setprofile() 設(shè)置的性能分析函數(shù)。

sys.gettrace()?

返回由 settrace() 設(shè)置的跟蹤函數(shù)。

CPython implementation detail: gettrace() 函數(shù)僅用于實(shí)現(xiàn)調(diào)試器,性能分析器,打包工具等。它的行為是實(shí)現(xiàn)平臺(tái)的一部分,而不是語言定義的一部分,因此并非在所有 Python 實(shí)現(xiàn)中都可用。

sys.getwindowsversion()?

返回一個(gè)具名元組,描述當(dāng)前正在運(yùn)行的 Windows 版本。元素名稱包括 major, minor, build, platform, service_pack, service_pack_minor, service_pack_major, suite_mask, product_typeplatform_version。service_pack 包含一個(gè)字符串,platform_version 包含一個(gè)三元組,其他所有值都是整數(shù)。元素也可以通過名稱來訪問,所以 sys.getwindowsversion()[0]sys.getwindowsversion().major 是等效的。為保持與舊版本的兼容性,只有前 5 個(gè)元素可以用索引檢索。

platform 將會(huì)是 2 (VER_PLATFORM_WIN32_NT)

product_type 可能是以下值之一:

常量

含意

1 (VER_NT_WORKSTATION)

系統(tǒng)是工作站。

2 (VER_NT_DOMAIN_CONTROLLER)

系統(tǒng)是域控制器。

3 (VER_NT_SERVER)

系統(tǒng)是服務(wù)器,但不是域控制器。

本函數(shù)包裝了 Win32 GetVersionEx() 函數(shù),參閱 Microsoft 文檔有關(guān) OSVERSIONINFOEX() 的內(nèi)容可獲取這些字段的更多信息。

platform_version 返回當(dāng)前操作系統(tǒng)的主要版本、次要版本和編譯版本號(hào),而不是為該進(jìn)程所模擬的版本。 它旨在用于日志記錄而非特性檢測(cè)。

備注

platform_version 會(huì)從 kernel32.dll 獲取版本號(hào),這個(gè)版本可能與 OS 版本不同。 請(qǐng)使用 platform 模塊來獲取準(zhǔn)確的 OS 版本號(hào)。

可用性: Windows。

在 3.2 版更改: 更改為具名元組,添加 service_pack_minor, service_pack_major, suite_maskproduct_type。

在 3.6 版更改: 添加了 platform_version

sys.get_asyncgen_hooks()?

返回一個(gè) asyncgen_hooks 對(duì)象,該對(duì)象類似于 namedtuple,形式為 (firstiter, finalizer),其中 firstiterfinalizerNone 或函數(shù),函數(shù)以 異步生成器迭代器 作為參數(shù),并用于在事件循環(huán)中干預(yù)異步生成器的終結(jié)。

3.6 新版功能: 詳情請(qǐng)參閱 PEP 525。

備注

本函數(shù)已添加至?xí)憾ㄜ浖ㄔ斍檎?qǐng)參閱 PEP 411 )。

sys.get_coroutine_origin_tracking_depth()?

獲取由 set_coroutine_origin_tracking_depth() 設(shè)置的協(xié)程來源的追蹤深度。

3.7 新版功能.

備注

本函數(shù)已添加至?xí)憾ㄜ浖ㄔ斍檎?qǐng)參閱 PEP 411 )。僅將其用于調(diào)試目的。

sys.hash_info?

一個(gè) 具名元組,給出數(shù)字類型的哈希的實(shí)現(xiàn)參數(shù)。關(guān)于數(shù)字類型的哈希的詳情請(qǐng)參閱 數(shù)字類型的哈希運(yùn)算

attribute -- 屬性

說明

width

用于哈希值的位寬度

modulus

用于數(shù)字散列方案的素?cái)?shù)模數(shù)P。

inf

為正無窮大返回的哈希值

nan

(該屬性已不再被使用)

imag

用于復(fù)數(shù)虛部的乘數(shù)

algorithm

字符串、字節(jié)和內(nèi)存視圖的哈希算法的名稱

hash_bits

哈希算法的內(nèi)部輸出大小。

seed_bits

散列算法的種子密鑰的大小

3.2 新版功能.

在 3.4 版更改: 添加了 algorithm, hash_bitsseed_bits

sys.hexversion?

編碼為單個(gè)整數(shù)的版本號(hào)。該整數(shù)會(huì)確保每個(gè)版本都自增,其中適當(dāng)包括了未發(fā)布版本。舉例來說,要測(cè)試 Python 解釋器的版本不低于 1.5.2,請(qǐng)使用:

if sys.hexversion >= 0x010502F0:
    # use some advanced feature
    ...
else:
    # use an alternative implementation or warn the user
    ...

之所以稱它為 hexversion,是因?yàn)橹挥袑⑺鼈魅雰?nèi)置函數(shù) hex() 后,其結(jié)果才看起來有意義。也可以使用 具名元組 sys.version_info,它對(duì)相同信息有著更人性化的編碼。

關(guān)于 hexversion 的更多信息可以在 API 和 ABI 版本管理 中找到。

sys.implementation?

一個(gè)對(duì)象,該對(duì)象包含當(dāng)前運(yùn)行的 Python 解釋器的實(shí)現(xiàn)信息。所有 Python 實(shí)現(xiàn)中都必須存在下列屬性。

name 是當(dāng)前實(shí)現(xiàn)的標(biāo)識(shí)符,如 'cpython'。實(shí)際的字符串由 Python 實(shí)現(xiàn)定義,但保證是小寫字母。

version 是一個(gè)具名元組,格式與 sys.version_info 相同。它表示 Python 實(shí)現(xiàn) 的版本。 另一個(gè)(由 sys.version_info 表示)是當(dāng)前解釋器遵循的相應(yīng) Python 語言 的版本,兩者具有不同的含義。 例如,對(duì)于 PyPy 1.8,sys.implementation.version 可能是 sys.version_info(1, 8, 0, 'final', 0),而 sys.version_info 則是 sys.version_info(2, 7, 2, 'final', 0)。對(duì)于 CPython 而言兩個(gè)值是相同的,因?yàn)樗菂⒖紝?shí)現(xiàn)。

hexversion 是十六進(jìn)制的實(shí)現(xiàn)版本,類似于 sys.hexversion。

cache_tag 是導(dǎo)入機(jī)制使用的標(biāo)記,用于已緩存模塊的文件名。按照慣例,它將由實(shí)現(xiàn)的名稱和版本組成,如 'cpython-33'。但如果合適,Python 實(shí)現(xiàn)可以使用其他值。如果 cache_tag 被置為 None,表示模塊緩存已禁用。

sys.implementation 可能包含相應(yīng) Python 實(shí)現(xiàn)的其他屬性。這些非標(biāo)準(zhǔn)屬性必須以下劃線開頭,此處不詳細(xì)闡述。無論其內(nèi)容如何,sys.implementation 在解釋器運(yùn)行期間或不同實(shí)現(xiàn)版本之間都不會(huì)更改。(但是不同 Python 語言版本間可能會(huì)不同。)詳情請(qǐng)參閱 PEP 421。

3.3 新版功能.

備注

新的必要屬性的添加必須經(jīng)過常規(guī)的 PEP 過程。詳情請(qǐng)參閱 PEP 421

sys.int_info?

一個(gè) 具名元組,包含 Python 內(nèi)部整數(shù)表示形式的信息。這些屬性是只讀的。

屬性

說明

bits_per_digit

每個(gè)數(shù)字占有的位數(shù)。Python 內(nèi)部將整數(shù)存儲(chǔ)在基底 2**int_info.bits_per_digit

sizeof_digit

用于表示數(shù)字的C類型的字節(jié)大小

3.1 新版功能.

sys.__interactivehook__?

當(dāng)本屬性存在,則以 交互模式 啟動(dòng)解釋器時(shí),將自動(dòng)(不帶參數(shù)地)調(diào)用本屬性的值。該過程是在讀取 PYTHONSTARTUP 文件之后完成的,所以可以在該文件中設(shè)置這一鉤子。site 模塊 設(shè)置了這一屬性。

引發(fā)一個(gè) 審計(jì)事件 cpython.run_interactivehook,附帶參數(shù) hook。

3.4 新版功能.

sys.intern(string)?

string 插入 "interned" (駐留)字符串表,返回被插入的字符串 -- 它是 string 本身或副本。駐留字符串對(duì)提高字典查找的性能很有用 -- 如果字典中的鍵已駐留,且所查找的鍵也已駐留,則鍵(取散列后)的比較可以用指針代替字符串來比較。通常,Python 程序使用到的名稱會(huì)被自動(dòng)駐留,且用于保存模塊、類或?qū)嵗龑傩缘淖值涞逆I也已駐留。

駐留字符串不是永久存在的,對(duì) intern() 返回值的引用必須保留下來,才能發(fā)揮駐留字符串的優(yōu)勢(shì)。

sys.is_finalizing()?

如果 Python 解釋器 正在關(guān)閉 則返回 True,否則返回 False。

3.5 新版功能.

sys.last_type?
sys.last_value?
sys.last_traceback?

這三個(gè)變量并非總是有定義,僅當(dāng)有異常未處理,且解釋器打印了錯(cuò)誤消息和堆?;厮輹r(shí),才會(huì)給它們賦值。它們的預(yù)期用途,是允許交互中的用戶導(dǎo)入調(diào)試器模塊,進(jìn)行事后調(diào)試,而不必重新運(yùn)行導(dǎo)致錯(cuò)誤的命令。(通常使用 import pdb; pdb.pm() 進(jìn)入事后調(diào)試器,詳情請(qǐng)參閱 pdb 模塊。)

這些變量的含義與上述 exc_info() 返回值的含義相同。

sys.maxsize?

一個(gè)整數(shù),表示 Py_ssize_t 類型的變量可以取到的最大值。在 32 位平臺(tái)上通常為 2**31 - 1,在 64 位平臺(tái)上通常為 2**63 - 1

sys.maxunicode?

一個(gè)整數(shù),表示最大的 Unicode 碼點(diǎn)值,如 1114111 (十六進(jìn)制為 0x10FFFF )。

在 3.3 版更改: PEP 393 之前,sys.maxunicode 曾是 0xFFFF0x10FFFF,具體取決于配置選項(xiàng),該選項(xiàng)指定將 Unicode 字符存儲(chǔ)為 UCS-2 還是 UCS-4。

sys.meta_path?

一個(gè)由 元路徑查找器 對(duì)象組成的列表,當(dāng)查找需要導(dǎo)入的模塊時(shí),會(huì)調(diào)用這些對(duì)象的 find_spec() 方法,觀察這些對(duì)象是否能找到所需模塊。調(diào)用 find_spec() 方法最少需要傳入待導(dǎo)入模塊的絕對(duì)名稱。如果待導(dǎo)入模塊包含在一個(gè)包中,則父包的 __path__ 屬性將作為第二個(gè)參數(shù)被傳入。該方法返回 模塊規(guī)格,找不到模塊則返回 None。

參見

importlib.abc.MetaPathFinder

抽象基類,定義了 meta_path 內(nèi)的查找器對(duì)象的接口。

importlib.machinery.ModuleSpec

find_spec() 返回的實(shí)例所對(duì)應(yīng)的具體類。

在 3.4 版更改: 在 Python 3.4 中通過 PEP 451 引入了 模塊規(guī)格。早期版本的 Python 會(huì)尋找一個(gè)稱為 find_module() 的方法。如果某個(gè) meta_path 條目沒有 find_spec() 方法,就會(huì)回退去調(diào)用前一種方法。

sys.modules?

This is a dictionary that maps module names to modules which have already been loaded. This can be manipulated to force reloading of modules and other tricks. However, replacing the dictionary will not necessarily work as expected and deleting essential items from the dictionary may cause Python to fail. If you want to iterate over this global dictionary always use sys.modules.copy() or tuple(sys.modules) to avoid exceptions as its size may change during iteration as a side effect of code or activity in other threads.

sys.orig_argv?

傳給 Python 可執(zhí)行文件的原始命令行參數(shù)列表。

另請(qǐng)參閱 sys.argv

3.10 新版功能.

sys.path?

一個(gè)由字符串組成的列表,用于指定模塊的搜索路徑。初始化自環(huán)境變量 PYTHONPATH,再加上一條與安裝有關(guān)的默認(rèn)路徑。

By default, as initialized upon program startup, a potentially unsafe path is prepended to sys.path (before the entries inserted as a result of PYTHONPATH):

  • python -m module command line: prepend the current working directory.

  • python script.py command line: prepend the script's directory. If it's a symbolic link, resolve symbolic links.

  • python -c code and python (REPL) command lines: prepend an empty string, which means the current working directory.

To not prepend this potentially unsafe path, use the -P command line option or the PYTHONSAFEPATH environment variable?

程序可以隨意修改本列表用于自己的目的。只能向 sys.path 中添加 string 和 bytes 類型,其他數(shù)據(jù)類型將在導(dǎo)入期間被忽略。

參見

  • site 模塊,該模塊描述了如何使用 .pth 文件來擴(kuò)展 sys.path。

sys.path_hooks?

一個(gè)由可調(diào)用對(duì)象組成的列表,這些對(duì)象接受一個(gè)路徑作為參數(shù),并嘗試為該路徑創(chuàng)建一個(gè) 查找器。如果成功創(chuàng)建查找器,則可調(diào)用對(duì)象將返回它,否則將引發(fā) ImportError 異常。

本特性最早在 PEP 302 中被提及。

sys.path_importer_cache?

一個(gè)字典,作為 查找器 對(duì)象的緩存。key 是傳入 sys.path_hooks 的路徑,value 是相應(yīng)已找到的查找器。如果路徑是有效的文件系統(tǒng)路徑,但在 sys.path_hooks 中未找到查找器,則存入 None

本特性最早在 PEP 302 中被提及。

在 3.3 版更改: 未找到查找器時(shí),改為存儲(chǔ) None,而不是 imp.NullImporter。

sys.platform?

本字符串是一個(gè)平臺(tái)標(biāo)識(shí)符,舉例而言,該標(biāo)識(shí)符可用于將特定平臺(tái)的組件追加到 sys.path 中。

對(duì)于 Unix 系統(tǒng)(除 Linux 和 AIX 外),該字符串是 Python 構(gòu)建時(shí)的 uname -s 返回的小寫操作系統(tǒng)名稱,并附加了 uname -r 返回的系統(tǒng)版本的第一部分,如 'sunos5''freebsd8'。除非需要檢測(cè)特定版本的系統(tǒng),否則建議使用以下習(xí)慣用法:

if sys.platform.startswith('freebsd'):
    # FreeBSD-specific code here...
elif sys.platform.startswith('linux'):
    # Linux-specific code here...
elif sys.platform.startswith('aix'):
    # AIX-specific code here...

對(duì)于其他系統(tǒng),值是:

系統(tǒng)

平臺(tái)

AIX

'aix'

Emscripten

'emscripten'

Linux

'linux'

WASI

'wasi'

Windows

'win32'

Windows/Cygwin

'cygwin'

macOS

'darwin'

在 3.3 版更改: 在 Linux 上,sys.platform 將不再包含副版本號(hào)。它將總是 'linux' 而不是 'linux2''linux3'。由于舊版本的 Python 會(huì)包含該版本號(hào),因此推薦總是使用上述 startswith 習(xí)慣用法。

在 3.8 版更改: 在 AIX 上,sys.platform 將不再包含副版本號(hào)。它將總是 'aix' 而不是 'aix5''aix7'。由于舊版本的 Python 會(huì)包含該版本號(hào),因此推薦總是使用上述 startswith 習(xí)慣用法。

參見

os.name 更加簡(jiǎn)略。os.uname() 提供系統(tǒng)的版本信息。

platform 模塊對(duì)系統(tǒng)的標(biāo)識(shí)有更詳細(xì)的檢查。

sys.platlibdir?

平臺(tái)專用庫目錄。用于構(gòu)建標(biāo)準(zhǔn)庫的路徑和已安裝擴(kuò)展模塊的路徑。

在大多數(shù)平臺(tái)上,它等同于 "lib" 。在 Fedora 和 SuSE 上,它等同于給出了以下 sys.path 路徑的 64 位平臺(tái)上的 "lib64" (其中 X.Y 是 Python 的 major.minor 版本)。

  • /usr/lib64/pythonX.Y/:標(biāo)準(zhǔn)庫(如 os 模塊的 os.py

  • /usr/lib64/pythonX.Y/lib-dynload/:標(biāo)準(zhǔn)庫的 C 擴(kuò)展模塊(如 errno 模塊,確切的文件名取決于平臺(tái))

  • /usr/lib/pythonX.Y/site-packages/ (請(qǐng)使用 lib, 而非 sys.platlibdir): 第三方模塊

  • /usr/lib64/pythonX.Y/site-packages/: 第三方包的 C 擴(kuò)展模塊

3.9 新版功能.

sys.prefix?

A string giving the site-specific directory prefix where the platform independent Python files are installed; on Unix, the default is '/usr/local'. This can be set at build time with the --prefix argument to the configure script. See 安裝路徑 for derived paths.

備注

如果在一個(gè) 虛擬環(huán)境 中,那么該值將在 site.py 中被修改,指向虛擬環(huán)境。Python 安裝位置仍然可以用 base_prefix 來獲取。

sys.ps1?
sys.ps2?

字符串,指定解釋器的首要和次要提示符。僅當(dāng)解釋器處于交互模式時(shí),它們才有定義。這種情況下,它們的初值為 '>>> ''... '。如果賦給其中某個(gè)變量的是非字符串對(duì)象,則每次解釋器準(zhǔn)備讀取新的交互式命令時(shí),都會(huì)重新運(yùn)行該對(duì)象的 str(),這可以用來實(shí)現(xiàn)動(dòng)態(tài)的提示符。

sys.setdlopenflags(n)?

設(shè)置解釋器在調(diào)用 dlopen() 時(shí)用到的標(biāo)志,例如解釋器在加載擴(kuò)展模塊時(shí)。首先,調(diào)用 sys.setdlopenflags(0) 將在導(dǎo)入模塊時(shí)對(duì)符號(hào)啟用惰性解析。要在擴(kuò)展模塊之間共享符號(hào),請(qǐng)調(diào)用 sys.setdlopenflags(os.RTLD_GLOBAL)。標(biāo)志值的符號(hào)名稱可以在 os 模塊中找到(即 RTLD_xxx 常量,如 os.RTLD_LAZY )。

可用性: Unix。

sys.setprofile(profilefunc)?

設(shè)置系統(tǒng)的性能分析函數(shù),該函數(shù)使得在 Py??thon 中能夠?qū)崿F(xiàn)一個(gè) Python 源代碼性能分析器。關(guān)于 Python Profiler 的更多信息請(qǐng)參閱 Python Profilers 分析器 章節(jié)。性能分析函數(shù)的調(diào)用方式類似于系統(tǒng)的跟蹤函數(shù)(參閱 settrace() ),但它是通過不同的事件調(diào)用的,例如,不是每執(zhí)行一行代碼就調(diào)用它一次(僅在調(diào)用某函數(shù)和從某函數(shù)返回時(shí)才會(huì)調(diào)用性能分析函數(shù),但即使某函數(shù)發(fā)生異常也會(huì)算作返回事件)。該函數(shù)是特定于單個(gè)線程的,但是性能分析器無法得知線程之間的上下文切換,因此在存在多個(gè)線程的情況下使用它是沒有意義的。另外,因?yàn)樗姆祷刂挡粫?huì)被用到,所以可以簡(jiǎn)單地返回 None。性能分析函數(shù)中的錯(cuò)誤將導(dǎo)致其自身被解除設(shè)置。

性能分析函數(shù)應(yīng)接收三個(gè)參數(shù):frameeventarg。frame 是當(dāng)前的堆棧幀。event 是一個(gè)字符串:'call''return'、'c_call''c_return''c_exception'。arg 取決于事件類型。

引發(fā)一個(gè) 審計(jì)事件 sys.setprofile,不附帶任何參數(shù)。

這些事件具有以下含義:

'call'

表示調(diào)用了某個(gè)函數(shù)(或進(jìn)入了其他的代碼塊)。性能分析函數(shù)將被調(diào)用,argNone。

'return'

表示某個(gè)函數(shù)(或別的代碼塊)即將返回。性能分析函數(shù)將被調(diào)用,arg 是即將返回的值,如果此次返回事件是由于拋出異常,argNone。

'c_call'

表示即將調(diào)用某個(gè) C 函數(shù)。它可能是擴(kuò)展函數(shù)或是內(nèi)建函數(shù)。arg 是 C 函數(shù)對(duì)象。

'c_return'

表示返回了某個(gè) C 函數(shù)。arg 是 C 函數(shù)對(duì)象。

'c_exception'

表示某個(gè) C 函數(shù)拋出了異常。arg 是 C 函數(shù)對(duì)象。

sys.setrecursionlimit(limit)?

將 Python 解釋器堆棧的最大深度設(shè)置為 limit。此限制可防止無限遞歸導(dǎo)致的 C 堆棧溢出和 Python 崩潰。

不同平臺(tái)所允許的最高限值不同。當(dāng)用戶有需要深度遞歸的程序且平臺(tái)支持更高的限值,可能就需要調(diào)高限值。進(jìn)行該操作需要謹(jǐn)慎,因?yàn)檫^高的限值可能會(huì)導(dǎo)致崩潰。

如果新的限值低于當(dāng)前的遞歸深度,將拋出 RecursionError 異常。

在 3.5.1 版更改: 如果新的限值低于當(dāng)前的遞歸深度,現(xiàn)在將拋出 RecursionError 異常。

sys.setswitchinterval(interval)?

設(shè)置解釋器的線程切換間隔時(shí)間(單位為秒)。該浮點(diǎn)數(shù)決定了“時(shí)間片”的理想持續(xù)時(shí)間,時(shí)間片將分配給同時(shí)運(yùn)行的 Python 線程。請(qǐng)注意,實(shí)際值可能更高,尤其是使用了運(yùn)行時(shí)間長的內(nèi)部函數(shù)或方法時(shí)。同時(shí),在時(shí)間間隔末尾調(diào)度哪個(gè)線程是操作系統(tǒng)的決定。解釋器沒有自己的調(diào)度程序。

3.2 新版功能.

sys.settrace(tracefunc)?

設(shè)置系統(tǒng)的跟蹤函數(shù),使得用戶在 Python 中就可以實(shí)現(xiàn) Python 源代碼調(diào)試器。該函數(shù)是特定于單個(gè)線程的,所以要讓調(diào)試器支持多線程,必須為正在調(diào)試的每個(gè)線程都用 settrace() 注冊(cè)一個(gè)跟蹤函數(shù),或使用 threading.settrace()

跟蹤函數(shù)應(yīng)接收三個(gè)參數(shù):frame、eventarg。frame 是當(dāng)前的堆棧幀。event 是一個(gè)字符串:'call'、'line'、'return'、'exception''opcode'。arg 取決于事件類型。

每次進(jìn)入 trace 函數(shù)的新的局部作用范圍,都會(huì)調(diào)用 trace 函數(shù)( event 會(huì)被設(shè)置為 'call' ),它應(yīng)該返回一個(gè)引用,指向即將用在新作用范圍上的局部跟蹤函數(shù);如果不需要跟蹤當(dāng)前的作用范圍,則返回 None。

局部跟蹤函數(shù)應(yīng)返回對(duì)自身的引用(或?qū)α硪粋€(gè)函數(shù)的引用,用來在其作用范圍內(nèi)進(jìn)行進(jìn)一步的跟蹤),或者返回 None 來停止跟蹤其作用范圍。

如果跟蹤函數(shù)出錯(cuò),則該跟蹤函數(shù)將被取消設(shè)置,類似于調(diào)用 settrace(None)

這些事件具有以下含義:

'call'

表示調(diào)用了某個(gè)函數(shù)(或進(jìn)入了其他的代碼塊)。全局跟蹤函數(shù)將被調(diào)用,argNone。返回值將指定局部跟蹤函數(shù)。

'line'

表示解釋器即將執(zhí)行新一行代碼或重新執(zhí)行循環(huán)條件。局部跟蹤函數(shù)將被調(diào)用,argNone,其返回值將指定新的局部跟蹤函數(shù)。關(guān)于其工作原理的詳細(xì)說明,請(qǐng)參見 Objects/lnotab_notes.txt。要在該堆棧幀禁用每行觸發(fā)事件,可以在堆棧幀上將 f_trace_lines 設(shè)置為 False

'return'

表示某個(gè)函數(shù)(或別的代碼塊)即將返回。局部跟蹤函數(shù)將被調(diào)用,arg 是即將返回的值,如果此次返回事件是由于拋出異常,argNone。跟蹤函數(shù)的返回值將被忽略。

'exception'

表示發(fā)生了某個(gè)異常。局部跟蹤函數(shù)將被調(diào)用,arg 是一個(gè) (exception, value, traceback) 元組,返回值將指定新的局部跟蹤函數(shù)。

'opcode'

表示解釋器即將執(zhí)行一個(gè)新的操作碼(操作碼的詳情請(qǐng)參閱 dis )。局部跟蹤函數(shù)將被調(diào)用,argNone,其返回值將指定新的局部跟蹤函數(shù)。每操作碼觸發(fā)事件默認(rèn)情況下都不發(fā)出:必須在堆棧幀上將 f_trace_opcodes 顯式地設(shè)置為 True 來請(qǐng)求這些事件。

注意,由于異常是在鏈?zhǔn)秸{(diào)用中傳播的,所以每一級(jí)都會(huì)產(chǎn)生一個(gè) 'exception' 事件。

更細(xì)微的用法是,可以顯式地通過賦值 frame.f_trace = tracefunc 來設(shè)置跟蹤函數(shù),而不是用現(xiàn)有跟蹤函數(shù)的返回值去間接設(shè)置它。當(dāng)前幀上的跟蹤函數(shù)必須激活,而 settrace() 還沒有做這件事。注意,為了使上述設(shè)置起效,必須使用 settrace() 來安裝全局跟蹤函數(shù)才能啟用運(yùn)行時(shí)跟蹤機(jī)制,但是它不必與上述是同一個(gè)跟蹤函數(shù)(它可以是一個(gè)開銷很低的跟蹤函數(shù),只返回 None,即在各個(gè)幀上立即將其自身禁用)。

關(guān)于代碼對(duì)象和幀對(duì)象的更多信息請(qǐng)參考 標(biāo)準(zhǔn)類型層級(jí)結(jié)構(gòu)。

引發(fā)一個(gè) 審計(jì)事件 sys.settrace,不附帶任何參數(shù)。

CPython implementation detail: settrace() 函數(shù)僅用于實(shí)現(xiàn)調(diào)試器,性能分析器,打包工具等。它的行為是實(shí)現(xiàn)平臺(tái)的一部分,而不是語言定義的一部分,因此并非在所有 Python 實(shí)現(xiàn)中都可用。

在 3.7 版更改: 添加了 'opcode' 事件類型;為幀對(duì)象添加了 f_trace_linesf_trace_opcodes 屬性

sys.set_asyncgen_hooks(firstiter, finalizer)?

接受兩個(gè)可選的關(guān)鍵字參數(shù),要求它們是可調(diào)用對(duì)象,且接受一個(gè) 異步生成器迭代器 作為參數(shù)。firstiter 對(duì)象將在異步生成器第一次迭代時(shí)調(diào)用。finalizer 將在異步生成器即將被銷毀時(shí)調(diào)用。

引發(fā)一個(gè) 審計(jì)事件 sys.set_asyncgen_hooks_firstiter,不附帶任何參數(shù)。

引發(fā)一個(gè) 審計(jì)事件 sys.set_asyncgen_hooks_finalizer,不附帶任何參數(shù)。

之所以會(huì)引發(fā)兩個(gè)審計(jì)事件,是因?yàn)榈讓拥?API 由兩個(gè)調(diào)用組成,每個(gè)調(diào)用都須要引發(fā)自己的事件。

3.6 新版功能: 更多詳情請(qǐng)參閱 PEP 525,finalizer 方法的參考示例可參閱 Lib/asyncio/base_events.pyasyncio.Loop.shutdown_asyncgens 的實(shí)現(xiàn)。

備注

本函數(shù)已添加至?xí)憾ㄜ浖ㄔ斍檎?qǐng)參閱 PEP 411 )。

sys.set_coroutine_origin_tracking_depth(depth)?

用于啟用或禁用協(xié)程溯源。啟用后,協(xié)程對(duì)象上的 cr_origin 屬性將包含一個(gè)元組,它由多個(gè)(文件名 filename,行號(hào) line number,函數(shù)名 function name)元組組成,整個(gè)元組描述出了協(xié)程對(duì)象創(chuàng)建過程的回溯,元組首端是最近一次的調(diào)用。禁用后,cr_origin 將為 None。

要啟用,請(qǐng)向 depth 傳遞一個(gè)大于零的值,它指定了有多少幀將被捕獲信息。要禁用,請(qǐng)將 depth 置為零。

該設(shè)置是特定于單個(gè)線程的。

3.7 新版功能.

備注

本函數(shù)已添加至?xí)憾ㄜ浖ㄔ斍檎?qǐng)參閱 PEP 411 )。僅將其用于調(diào)試目的。

sys._enablelegacywindowsfsencoding()?

filesystem encoding and error handler 分別修改為 'mbcs' 和 'replace',以便與 3.6 之前版本的 Python 保持一致。

這等同于在啟動(dòng) Python 前先定義好 PYTHONLEGACYWINDOWSFSENCODING 環(huán)境變量。

另請(qǐng)參閱 sys.getfilesystemencoding()sys.getfilesystemencodeerrors()。

可用性: Windows。

3.6 新版功能: 更多詳情請(qǐng)參閱 PEP 529。

sys.stdin?
sys.stdout?
sys.stderr?

解釋器用于標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤的 文件對(duì)象

  • stdin 用于所有交互式輸入(包括對(duì) input() 的調(diào)用);

  • stdout 用于 print()expression 語句的輸出,以及用于 input() 的提示符;

  • 解釋器自身的提示符和它的錯(cuò)誤消息都發(fā)往 stderr。

這些流都是常規(guī) 文本文件,與 open() 函數(shù)返回的對(duì)象一致。它們的參數(shù)選擇如下:

  • 編碼格式和錯(cuò)誤處理句柄是由 PyConfig.stdio_encodingPyConfig.stdio_errors 來初始化的。

    在 Windows 上,控制臺(tái)設(shè)備使用 UTF-8。 非字符設(shè)備如磁盤文件和管道使用系統(tǒng)語言區(qū)域編碼格式(例如 ANSI 代碼頁)。 非控制臺(tái)字符設(shè)備如 NUL(例如當(dāng) isatty() 返回 True 時(shí))會(huì)在啟動(dòng)時(shí)分別讓 stdin 和 stdout/stderr 使用控制臺(tái)輸入和輸出代碼頁。 如果進(jìn)程初始化時(shí)沒有被附加到控制臺(tái)則會(huì)使用默認(rèn)的系統(tǒng) locale encoding。

    要重寫控制臺(tái)的特殊行為,可以在啟動(dòng) Python 前設(shè)置 PYTHONLEGACYWINDOWSSTDIO 環(huán)境變量。此時(shí),控制臺(tái)代碼頁將用于其他字符設(shè)備。

    在所有平臺(tái)上,都可以通過在 Python 啟動(dòng)前設(shè)置 PYTHONIOENCODING 環(huán)境變量來重寫字符編碼,或通過新的 -X utf8 命令行選項(xiàng)和 PYTHONUTF8 環(huán)境變量來設(shè)置。但是,對(duì) Windows 控制臺(tái)來說,上述方法僅在設(shè)置了 PYTHONLEGACYWINDOWSSTDIO 后才起效。

  • 交互模式下,stdout 流是行緩沖的。其他情況下,它像常規(guī)文本文件一樣是塊緩沖的。兩種情況下的 stderr 流都是行緩沖的。要使得兩個(gè)流都變成無緩沖,可以傳入 -u 命令行選項(xiàng)或設(shè)置 PYTHONUNBUFFERED 環(huán)境變量。

在 3.9 版更改: 非交互模式下,stderr 現(xiàn)在是行緩沖的,而不是全緩沖的。

備注

要從標(biāo)準(zhǔn)流寫入或讀取二進(jìn)制數(shù)據(jù),請(qǐng)使用底層二進(jìn)制 buffer 對(duì)象。例如,要將字節(jié)寫入 stdout,請(qǐng)使用 sys.stdout.buffer.write(b'abc')。

但是,如果你在寫一個(gè)庫(并且不限制執(zhí)行庫代碼時(shí)的上下文),那么請(qǐng)注意,標(biāo)準(zhǔn)流可能會(huì)被替換為文件類對(duì)象,如 io.StringIO,它們是不支持 buffer 屬性的。

sys.__stdin__?
sys.__stdout__?
sys.__stderr__?

程序開始時(shí),這些對(duì)象存有 stdin、stderrstdout 的初始值。它們?cè)诔绦蚪Y(jié)束前都可以使用,且在需要向?qū)嶋H的標(biāo)準(zhǔn)流打印內(nèi)容時(shí)很有用,無論 sys.std* 對(duì)象是否已重定向。

如果實(shí)際文件已經(jīng)被覆蓋成一個(gè)損壞的對(duì)象了,那它也可用于將實(shí)際文件還原成能正常工作的文件對(duì)象。但是,本過程的最佳方法應(yīng)該是,在原來的流被替換之前就顯式地保存它,并使用這一保存的對(duì)象來還原。

備注

某些情況下的 stdinstdoutstderr 以及初始值 __stdin__、__stdout____stderr__ 可以是 None。通常發(fā)生在未連接到控制臺(tái)的 Windows GUI app 中,以及在用 pythonw 啟動(dòng)的 Python app 中。

sys.stdlib_module_names?

一個(gè)包含標(biāo)準(zhǔn)庫模組名稱字符串的凍結(jié)集合。

它在所有平臺(tái)上都保持一致。 在某些平臺(tái)上不可用的模塊和在 Python 編譯時(shí)被禁用的模塊也會(huì)被列出。 所有種類的模塊都會(huì)被列出:純 Python 模塊、內(nèi)置模塊、凍結(jié)模塊和擴(kuò)展模塊等。 測(cè)試模塊則會(huì)被排除掉。

對(duì)于包來說,僅會(huì)列出主包:子包和子模塊不會(huì)被列出。 例如,email 包會(huì)被列出,但 email.mime 子包和 email.message 子模塊不會(huì)被列出。

另請(qǐng)參閱 sys.builtin_module_names 列表。

3.10 新版功能.

sys.thread_info?

一個(gè) 具名元組,包含線程實(shí)現(xiàn)的信息。

屬性

說明

name

線程實(shí)現(xiàn)的名稱:

  • 'nt': Windows 線程

  • 'pthread': POSIX 線程

  • 'solaris': Solaris 線程

lock

鎖實(shí)現(xiàn)的名稱:

  • 'semaphore': 鎖使用信號(hào)量

  • 'mutex+cond': 鎖使用互斥和條件變量

  • None 如果此信息未知

version

線程庫的名稱和版本。它是一個(gè)字符串,如果此信息未知,則為 None 。

3.3 新版功能.

sys.tracebacklimit?

當(dāng)該變量值設(shè)置為整數(shù),在發(fā)生未處理的異常時(shí),它將決定打印的回溯信息的最大層級(jí)數(shù)。默認(rèn)為 1000。當(dāng)將其設(shè)置為 0 或小于 0,將關(guān)閉所有回溯信息,并且只打印異常類型和異常值。

sys.unraisablehook(unraisable, /)?

處理一個(gè)無法拋出的異常。

它會(huì)在發(fā)生了一個(gè)異常但 Python 沒有辦法處理時(shí)被調(diào)用。例如,當(dāng)一個(gè)析構(gòu)器引發(fā)了異常,或在垃圾回收 (gc.collect()) 期間引發(fā)了異常。

unraisable 參數(shù)具有以下屬性:

  • exc_type: 異常類型

  • exc_value: 異常值,可以是 None.

  • exc_traceback: 異?;厮?,可以是 None.

  • err_msg: 錯(cuò)誤信息,可以是 None.

  • object: 導(dǎo)致異常的對(duì)象,可以為 None.

默認(rèn)的鉤子程序會(huì)將 err_msgobject 格式化為: f'{err_msg}: {object!r}';如果 err_msgNone 則采用 "Exception ignored in" 錯(cuò)誤信息。

要改變無法拋出的異常的處理過程,可以重寫 sys.unraisablehook()。

使用定制鉤子存放 exc_value 可能會(huì)創(chuàng)建引用循環(huán)。 它應(yīng)當(dāng)在不再需要異常時(shí)被顯式地清空以打破引用循環(huán)。

如果一個(gè) object 正在被銷毀,那么使用自定義的鉤子儲(chǔ)存該對(duì)象可能會(huì)將其復(fù)活。請(qǐng)?jiān)谧远x鉤子生效后避免儲(chǔ)存 object,以避免對(duì)象的復(fù)活。

另請(qǐng)參閱 excepthook(),它處理未捕獲的異常。

引發(fā)一個(gè)審計(jì)事件 sys.unraisablehook 并附帶參數(shù) hook, unraisable。

3.8 新版功能.

sys.version?

一個(gè)包含 Python 解釋器版本號(hào)加編譯版本號(hào)以及所用編譯器等額外信息的字符串。 此字符串會(huì)在交互式解釋器啟動(dòng)時(shí)顯示。 請(qǐng)不要從中提取版本信息,而應(yīng)當(dāng)使用 version_info 以及 platform 模塊所提供的函數(shù)。

sys.api_version?

這個(gè)解釋器的 C API 版本。當(dāng)你在調(diào)試 Python及期擴(kuò)展模板的版本沖突這個(gè)功能非常有用。

sys.version_info?

一個(gè)包含版本號(hào)五部分的元組: major, minor, micro, releaselevelserial。 除 releaselevel 外的所有值均為整數(shù);發(fā)布級(jí)別值則為 'alpha', 'beta', 'candidate''final'。 對(duì)應(yīng)于 Python 版本 2.0 的 version_info 值為 (2, 0, 0, 'final', 0)。 這些部分也可按名稱訪問,因此 sys.version_info[0] 就等價(jià)于 sys.version_info.major,依此類推。

在 3.1 版更改: 增加了以名稱表示的各部分屬性。

sys.warnoptions?

這是警告框架的一個(gè)實(shí)現(xiàn)細(xì)節(jié);請(qǐng)不要修改此值。 有關(guān)警告框架的更多信息請(qǐng)參閱 warnings 模塊。

sys.winver?

用于在 Windows 平臺(tái)上組成注冊(cè)表鍵的版本號(hào)。 這在 Python DLL 中存儲(chǔ)為 1000 號(hào)字符串資源。 其值通常是 version 的頭三個(gè)字符。 它在 sys 模塊中提供是為了信息展示目的;修改此值不會(huì)影響 Python 所使用的注冊(cè)表鍵。

可用性: Windows。

sys._xoptions?

一個(gè)字典,包含通過 -X 命令行選項(xiàng)傳遞的旗標(biāo),這些旗標(biāo)專屬于各種具體實(shí)現(xiàn)。選項(xiàng)名稱將會(huì)映射到對(duì)應(yīng)的值(如果顯式指定)或者 True。例如:

$ ./python -Xpycache_prefix=some_path -Xdev
Python 3.2a3+ (py3k, Oct 16 2010, 20:14:50)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys._xoptions
{'pycache_prefix': 'some_path', 'dev': True}

CPython implementation detail: 這是 CPython 專屬的訪問通過 -X 傳遞的選項(xiàng)的方式。 其他實(shí)現(xiàn)可能會(huì)通過其他方式導(dǎo)出它們,或者完全不導(dǎo)出。

3.2 新版功能.

引用

C99

ISO/IEC 9899:1999. "Programming languages -- C." 該標(biāo)準(zhǔn)的公開草案可從 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf獲得。