sys — 系統特定的引數和函式


此模組提供對直譯器使用或維護的一些變數以及與直譯器強互動的函式的訪問。它始終可用。除非另有明確說明,否則所有變數都是隻讀的。

sys.abiflags

在 POSIX 系統上,如果 Python 是用標準 configure 指令碼構建的,則此變數包含 PEP 3149 中指定的 ABI 標誌。

在 3.2 版本加入。

3.8 版中已更改: 預設標誌變為空字串(移除了 pymalloc 的 m 標誌)。

可用性: Unix。

sys.addaudithook(hook)

將可呼叫物件 *hook* 附加到當前(子)直譯器的活動審計鉤子列表。

當透過 sys.audit() 函式引發審計事件時,每個鉤子將按照其新增的順序被呼叫,並帶有事件名稱和引數元組。透過 PySys_AddAuditHook() 新增的本機鉤子首先被呼叫,然後是當前(子)直譯器中新增的鉤子。鉤子可以記錄事件、引發異常以中止操作,或完全終止程序。

請注意,審計鉤子主要用於收集有關內部或無法觀察到的操作的資訊,無論是 Python 還是用 Python 編寫的庫。它們不適合實現“沙箱”。特別是,惡意程式碼可以輕易停用或繞過使用此函式新增的鉤子。至少,任何安全敏感的鉤子都必須在使用 C API PySys_AddAuditHook() 初始化執行時之前新增,並且任何允許任意記憶體修改的模組(例如 ctypes)都應完全移除或嚴密監控。

呼叫 sys.addaudithook() 本身將引發一個名為 sys.addaudithook 且不帶引數的審計事件。如果任何現有鉤子引發派生自 RuntimeError 的異常,則不會新增新鉤子,並且異常將被抑制。因此,除非呼叫方控制所有現有鉤子,否則不能假定其鉤子已新增。

有關 CPython 引發的所有事件,請參見審計事件表,有關原始設計討論,請參見 PEP 578

在 3.8 版本加入。

3.8.1 版中已更改: 派生自 Exception 但不是 RuntimeError 的異常不再被抑制。

CPython 實現細節: 當啟用追蹤時(參見 settrace()),只有當可呼叫物件有一個設定為真值的 __cantrace__ 成員時,Python 鉤子才會被追蹤。否則,追蹤函式將跳過該鉤子。

sys.argv

傳遞給 Python 指令碼的命令列引數列表。argv[0] 是指令碼名稱(這是否是完整路徑名取決於作業系統)。如果使用直譯器的 -c 命令列選項執行命令,則 argv[0] 設定為字串 '-c'。如果沒有將指令碼名稱傳遞給 Python 直譯器,則 argv[0] 是空字串。

要遍歷標準輸入或命令列上給定的檔案列表,請參見 fileinput 模組。

另請參見 sys.orig_argv

備註

在 Unix 上,命令列引數以位元組形式從作業系統傳遞。Python 使用檔案系統編碼和“surrogateescape”錯誤處理程式對其進行解碼。當您需要原始位元組時,可以透過 [os.fsencode(arg) for arg in sys.argv] 獲取。

sys.audit(event, *args)

引發審計事件並觸發任何活動的審計鉤子。*event* 是標識事件的字串,*args* 可能包含有關事件的更多資訊的可選引數。給定事件的引數數量和型別被認為是公共且穩定的 API,不應在不同版本之間修改。

例如,一個審計事件名為 os.chdir。此事件有一個名為 *path* 的引數,它將包含請求的新工作目錄。

sys.audit() 將呼叫現有審計鉤子,傳遞事件名稱和引數,並將重新引發任何鉤子的第一個異常。通常,如果引發異常,則不應處理它,並且應儘快終止程序。這允許鉤子實現決定如何響應特定事件:它們可以僅僅記錄事件或透過引發異常中止操作。

使用 sys.addaudithook()PySys_AddAuditHook() 函式新增鉤子。

此函式的原生等效項是 PySys_Audit()。如果可能,首選使用原生函式。

有關 CPython 引發的所有事件,請參見審計事件表

在 3.8 版本加入。

sys.base_exec_prefix

等同於 exec_prefix,但指向基礎 Python 安裝。

虛擬環境 下執行時,exec_prefix 會被覆蓋為虛擬環境字首。base_exec_prefix 則不會改變,始終指向基礎 Python 安裝。有關更多資訊,請參閱 虛擬環境

在 3.3 版本加入。

sys.base_prefix

等同於 prefix,但指向基礎 Python 安裝。

虛擬環境 下執行時,prefix 會被覆蓋為虛擬環境字首。base_prefix 則不會改變,始終指向基礎 Python 安裝。有關更多資訊,請參閱 虛擬環境

在 3.3 版本加入。

sys.byteorder

本機位元組順序的指示器。在大端序(最高有效位元組在前)平臺上,此值將為 'big',在小端序(最低有效位元組在前)平臺上將為 'little'

sys.builtin_module_names

一個字串元組,包含所有編譯到此 Python 直譯器中的模組的名稱。(此資訊無法透過其他方式獲得 — modules.keys() 只列出已匯入的模組。)

另請參見 sys.stdlib_module_names 列表。

sys.call_tracing(func, args)

在啟用追蹤的情況下呼叫 func(*args)。追蹤狀態會被儲存,並在之後恢復。這旨在從檢查點由偵錯程式呼叫,以遞迴除錯或分析其他程式碼。

呼叫由 settrace()setprofile() 設定的追蹤函式時,追蹤會暫停,以避免無限遞迴。call_tracing() 啟用追蹤函式的顯式遞迴。

sys.copyright

一個包含與 Python 直譯器相關的版權資訊的字串。

sys._clear_type_cache()

清除內部型別快取。型別快取用於加速屬性和方法查詢。*僅* 在引用洩露除錯期間刪除不必要的引用時使用此函式。

此函式僅應用於內部和專用目的。

自 3.13 版棄用: 改用更通用的 _clear_internal_caches() 函式。

sys._clear_internal_caches()

清除所有內部效能相關的快取。*僅* 在尋找記憶體洩漏時,為了釋放不必要的引用和記憶體塊而使用此函式。

在 3.13 版本加入。

sys._current_frames()

返回一個字典,將每個執行緒的識別符號對映到呼叫該函式時該執行緒中當前活動的頂部堆疊幀。請注意,traceback 模組中的函式可以根據此類幀構建呼叫堆疊。

這對於除錯死鎖最有用:此函式不需要死鎖執行緒的協作,並且這些執行緒的呼叫堆疊在它們死鎖期間保持凍結。對於非死鎖執行緒返回的幀可能與呼叫程式碼檢查幀時該執行緒的當前活動無關。

此函式僅應用於內部和專用目的。

引發一個帶有 sys._current_frames審計事件,不帶引數。

sys._current_exceptions()

返回一個字典,將每個執行緒的識別符號對映到呼叫該函式時該執行緒中當前活動的頂部異常。如果一個執行緒當前沒有處理異常,則它不包含在結果字典中。

這對於統計分析最有用。

此函式僅應用於內部和專用目的。

引發一個帶有 sys._current_exceptions審計事件,不帶引數。

3.12 版中已更改: 字典中的每個值現在都是一個單獨的異常例項,而不是 sys.exc_info() 返回的 3 元組。

sys.breakpointhook()

這個鉤子函式由內建的 breakpoint() 呼叫。預設情況下,它會將您帶入 pdb 偵錯程式,但可以將其設定為任何其他函式,以便您可以選擇使用哪個偵錯程式。

此函式的簽名取決於它呼叫的內容。例如,預設繫結(例如 pdb.set_trace())不期望任何引數,但您可能將其繫結到一個期望附加引數(位置和/或關鍵字)的函式。內建的 breakpoint() 函式會直接傳遞其 *args**kws。無論 breakpointhooks() 返回什麼,都會從 breakpoint() 返回。

預設實現首先會查詢環境變數 PYTHONBREAKPOINT。如果它設定為 "0",則此函式會立即返回;即它是一個空操作。如果環境變數未設定或設定為空字串,則會呼叫 pdb.set_trace()。否則,此變數應使用 Python 的點式匯入命名法(例如 package.subpackage.module.function)命名一個要執行的函式。在這種情況下,package.subpackage.module 將被匯入,並且生成的模組必須具有名為 function() 的可呼叫物件。這將執行,傳遞 *args**kws,並且無論 function() 返回什麼,sys.breakpointhook() 都會返回給內建的 breakpoint() 函式。

請注意,如果在匯入由 PYTHONBREAKPOINT 命名的可呼叫物件時出現任何問題,則會報告 RuntimeWarning,並且斷點將被忽略。

另請注意,如果 sys.breakpointhook() 以程式設計方式被覆蓋,則 *不會* 查詢 PYTHONBREAKPOINT

在 3.7 版本加入。

sys._debugmallocstats()

將有關 CPython 記憶體分配器狀態的底層資訊列印到 stderr。

如果 Python 以 除錯模式 構建(configure --with-pydebug option),它還會執行一些耗時的內部一致性檢查。

在 3.3 版本加入。

CPython 實現細節: 此函式特定於 CPython。此處未定義確切的輸出格式,並且可能會更改。

sys.dllhandle

指定 Python DLL 控制代碼的整數。

可用性: Windows。

sys.displayhook(value)

如果 *value* 不是 None,此函式會將 repr(value) 列印到 sys.stdout,並將 *value* 儲存到 builtins._ 中。如果 repr(value) 無法使用 sys.stdout.errors 錯誤處理程式(可能為 'strict')編碼為 sys.stdout.encoding,則使用 'backslashreplace' 錯誤處理程式將其編碼為 sys.stdout.encoding

sys.displayhook 在互動式 Python 會話中輸入的表示式求值結果上呼叫。這些值的顯示可以透過將另一個單引數函式分配給 sys.displayhook 進行自定義。

虛擬碼

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 版中已更改: UnicodeEncodeError 上使用 'backslashreplace' 錯誤處理程式。

sys.dont_write_bytecode

如果此項為真,Python 將不會在匯入源模組時嘗試寫入 .pyc 檔案。此值最初根據 -B 命令列選項和 PYTHONDONTWRITEBYTECODE 環境變數設定為 TrueFalse,但您可以自行設定以控制位元組碼檔案生成。

sys._emscripten_info

一個命名元組,包含 *wasm32-emscripten* 平臺環境的資訊。該命名元組是臨時的,將來可能會更改。

_emscripten_info.emscripten_version

Emscripten 版本,以整數元組形式表示(主、次、微),例如 (3, 1, 8)

_emscripten_info.runtime

執行時字串,例如瀏覽器使用者代理、'Node.js v14.18.2''UNKNOWN'

_emscripten_info.pthreads

如果 Python 使用 Emscripten pthreads 支援編譯,則為 True

_emscripten_info.shared_memory

如果 Python 使用共享記憶體支援編譯,則為 True

可用性:Emscripten。

在 3.11 版本中新增。

sys.pycache_prefix

如果此項已設定(不是 None),Python 會將位元組碼快取 .pyc 檔案寫入(並從其中讀取)一個以該目錄為根的並行目錄樹,而不是原始檔樹中的 __pycache__ 目錄。原始檔樹中的任何 __pycache__ 目錄都將被忽略,新的 .pyc 檔案將寫入 pycache 字首中。因此,如果您使用 compileall 作為預構建步驟,則必須確保在執行時使用相同的 pycache 字首(如果有)。

相對路徑是相對於當前工作目錄解釋的。

此值最初根據 -X pycache_prefix=PATH 命令列選項或 PYTHONPYCACHEPREFIX 環境變數的值設定(命令列優先)。如果兩者都未設定,則為 None

在 3.8 版本加入。

sys.excepthook(type, value, traceback)

此函式將給定的追蹤資訊和異常列印到 sys.stderr

當引發並捕獲到非 SystemExit 的異常時,直譯器會呼叫 sys.excepthook,並傳遞三個引數:異常類、異常例項和追蹤物件。在互動式會話中,這發生在控制權返回到提示符之前;在 Python 程式中,這發生在程式退出之前。可以透過將另一個三引數函式分配給 sys.excepthook 來自定義此類頂級異常的處理。

當發生未捕獲的異常時,引發一個審計事件 sys.excepthook,引數為 hooktypevaluetraceback。如果未設定鉤子,hook 可能為 None。如果任何鉤子引發派生自 RuntimeError 的異常,則對鉤子的呼叫將被抑制。否則,審計鉤子異常將被報告為不可引發,並呼叫 sys.excepthook

參見

sys.unraisablehook() 函式處理不可引發的異常,而 threading.excepthook() 函式處理由 threading.Thread.run() 引發的異常。

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

這些物件包含程式啟動時 breakpointhookdisplayhookexcepthookunraisablehook 的原始值。它們被儲存下來,以便在 breakpointhookdisplayhookexcepthookunraisablehook 被損壞或替代物件替換時可以恢復。

3.7 版新增: __breakpointhook__

3.8 版新增: __unraisablehook__

sys.exception()

當在異常處理程式執行期間(例如 exceptexcept* 子句)呼叫此函式時,它會返回此處理程式捕獲的異常例項。當異常處理程式相互巢狀時,只有最內部處理程式處理的異常可訪問。

如果沒有異常處理程式正在執行,此函式返回 None

在 3.11 版本中新增。

sys.exc_info()

此函式返回已處理異常的舊式表示。如果當前正在處理異常 e (因此 exception() 會返回 e),則 exc_info() 返回元組 (type(e), e, e.__traceback__)。也就是說,一個元組包含異常的型別(BaseException 的子類)、異常本身以及通常封裝異常最後發生時呼叫堆疊的追蹤物件

如果堆疊上的任何地方都沒有處理異常,則此函式返回一個包含三個 None 值的元組。

3.11 版中已更改: typetraceback 欄位現在從 value(異常例項)派生,因此當異常在處理期間被修改時,這些更改會反映在後續呼叫 exc_info() 的結果中。

sys.exec_prefix

一個字串,給出安裝平臺相關 Python 檔案的特定站點目錄字首;預設情況下,這也是 '/usr/local'。這可以在構建時使用 configure 指令碼的 --exec-prefix 引數設定。具體來說,所有配置檔案(例如 pyconfig.h 標頭檔案)都安裝在目錄 exec_prefix/lib/pythonX.Y/config 中,共享庫模組安裝在 exec_prefix/lib/pythonX.Y/lib-dynload 中,其中 *X.Y* 是 Python 的版本號,例如 3.2

備註

如果 虛擬環境 生效,此 exec_prefix 將指向虛擬環境。Python 安裝的值仍然可以透過 base_exec_prefix 獲得。有關更多資訊,請參閱 虛擬環境

3.14 版中已更改: 虛擬環境下執行時,prefixexec_prefix 現在由路徑初始化設定為虛擬環境字首,而不是 site。這意味著 prefixexec_prefix 始終指向虛擬環境,即使 site 被停用 (-S) 也是如此。

sys.executable

一個字串,給出 Python 直譯器可執行二進位制檔案的絕對路徑,在有意義的系統上。如果 Python 無法檢索其可執行檔案的真實路徑,sys.executable 將為空字串或 None

sys.exit([arg])

引發 SystemExit 異常,表示意圖退出直譯器。

可選引數 *arg* 可以是整數,給出退出狀態(預設為零),也可以是其他型別的物件。如果它是整數,零被 shell 等認為是“成功終止”,任何非零值都被認為是“異常終止”。大多數系統要求它在 0-127 範圍內,否則會產生未定義的結果。有些系統約定為特定退出程式碼分配特定含義,但這些通常不完善;Unix 程式通常使用 2 表示命令列語法錯誤,使用 1 表示所有其他型別的錯誤。如果傳遞了其他型別的物件,None 等同於傳遞零,任何其他物件都會列印到 stderr 並導致退出程式碼為 1。特別是,sys.exit("some error message") 是一種在發生錯誤時快速退出程式的方法。

由於 exit() 最終“只”引發異常,因此它只有在從主執行緒呼叫且異常未被截獲時才會退出程序。try 語句的 finally 子句指定的清理操作會得到執行,並且可以在更外層截獲退出嘗試。

3.6 版中已更改: 如果在 Python 直譯器捕獲到 SystemExit 之後(例如在標準流中重新整理緩衝資料時發生錯誤)的清理過程中發生錯誤,則退出狀態將更改為 120。

sys.flags

命名元組 *flags* 暴露了命令列標誌的狀態。標誌應僅透過名稱訪問,而不是透過索引訪問。屬性是隻讀的。

flags.debug

-d

flags.inspect

-i

flags.interactive

-i

flags.isolated

-I

flags.optimize

-O-OO

flags.dont_write_bytecode

-B

flags.no_user_site

-s

flags.no_site

-S

flags.ignore_environment

-E

flags.verbose

-v

flags.bytes_warning

-b

flags.quiet

-q

flags.hash_randomization

-R

flags.dev_mode

-X devPython 開發模式

flags.utf8_mode

-X utf8

flags.safe_path

-P

flags.int_max_str_digits

-X int_max_str_digits整數字符串轉換長度限制

flags.warn_default_encoding

-X warn_default_encoding

flags.gil

-X gilPYTHON_GIL

flags.thread_inherit_context

-X thread_inherit_contextPYTHON_THREAD_INHERIT_CONTEXT

flags.context_aware_warnings

-X context_aware_warningsPYTHON_CONTEXT_AWARE_WARNINGS

3.2 版中已更改: 添加了新 -q 標誌的 quiet 屬性。

3.2.3 版新增: hash_randomization 屬性。

3.3 版中已更改: 移除了過時的 division_warning 屬性。

3.4 版中已更改: -I isolated 標誌添加了 isolated 屬性。

3.7 版中已更改: 為新的 Python 開發模式 添加了 dev_mode 屬性,為新的 -X utf8 標誌添加了 utf8_mode 屬性。

3.10 版中已更改: -X warn_default_encoding 標誌添加了 warn_default_encoding 屬性。

3.11 版中已更改: -P 選項添加了 safe_path 屬性。

3.11 版中已更改: 添加了 int_max_str_digits 屬性。

3.13 版中已更改: 添加了 gil 屬性。

3.14 版中已更改: 添加了 thread_inherit_context 屬性。

3.14 版中已更改: 添加了 context_aware_warnings 屬性。

sys.float_info

一個命名元組,包含有關浮點型別的資訊。它包含有關精度和內部表示的低階資訊。這些值對應於“C”程式語言的標準標頭檔案 float.h 中定義的各種浮點常量;有關詳細資訊,請參閱 1999 年 ISO/IEC C 標準 [C99] 的 5.2.4.2.2 節“浮點型別的特性”。

float_info 命名元組的屬性

屬性

float.h 宏

解釋

float_info.epsilon

DBL_EPSILON

1.0 和大於 1.0 且可表示為浮點數的最小浮點數之間的差值。

另請參見 math.ulp()

float_info.dig

DBL_DIG

浮點數中可以忠實表示的最大十進位制位數;見下文。

float_info.mant_dig

DBL_MANT_DIG

浮點精度:浮點數的有效數字中基數 radix 的位數。

float_info.max

DBL_MAX

可表示的最大正有限浮點數。

float_info.max_exp

DBL_MAX_EXP

最大整數 *e*,使得 radix**(e-1) 是一個可表示的有限浮點數。

float_info.max_10_exp

DBL_MAX_10_EXP

最大的整數 *e*,使得 10**e 落在可表示的有限浮點數範圍內。

float_info.min

DBL_MIN

可表示的最小正 *規範化* 浮點數。

使用 math.ulp(0.0) 獲取最小的正 *非規範化* 可表示浮點數。

float_info.min_exp

DBL_MIN_EXP

最小的整數 *e*,使得 radix**(e-1) 是一個規範化的浮點數。

float_info.min_10_exp

DBL_MIN_10_EXP

最小的整數 *e*,使得 10**e 是一個規範化的浮點數。

float_info.radix

FLT_RADIX

指數表示的基數。

float_info.rounds

FLT_ROUNDS

一個整數,表示浮點算術的舍入模式。這反映瞭解釋器啟動時系統 FLT_ROUNDS 宏的值。

  • -1: 不確定

  • 0: 向零舍入

  • 1: 四捨五入到最近的偶數

  • 2: 向正無窮舍入

  • 3: 向負無窮舍入

FLT_ROUNDS 的所有其他值表示實現定義的舍入行為。

屬性 sys.float_info.dig 需要進一步解釋。如果 s 是一個表示最多 sys.float_info.dig 有效數字的十進位制數的任何字串,那麼將 s 轉換為浮點數並再次轉換回來將恢復表示相同十進位制值的字串。

>>> 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'

但是對於有效數字超過 sys.float_info.dig 的字串,情況並非總是如此。

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

一個字串,指示 repr() 函式對浮點數的行為。如果字串的值為 'short',則對於有限浮點數 xrepr(x) 旨在生成一個短字串,其屬性為 float(repr(x)) == x。這是 Python 3.1 及更高版本中的常見行為。否則,float_repr_style 的值為 'legacy',並且 repr(x) 的行為與 Python 3.1 之前版本中的行為相同。

在 3.1 版本加入。

sys.getallocatedblocks()

返回直譯器當前分配的記憶體塊數量,無論其大小如何。此函式主要用於跟蹤和除錯記憶體洩漏。由於直譯器的內部快取,結果可能因呼叫而異;您可能需要呼叫 _clear_internal_caches()gc.collect() 才能獲得更可預測的結果。

如果 Python 構建或實現無法合理地計算此資訊,則 getallocatedblocks() 允許返回 0。

在 3.4 版本加入。

sys.getunicodeinternedsize()

返回已 intern 的 Unicode 物件的數量。

3.12 新版功能.

sys.getandroidapilevel()

返回 Android 的構建時 API 級別作為整數。這表示此 Python 版本可以執行的 Android 的最低版本。有關執行時版本資訊,請參見 platform.android_ver()

可用性: Android。

在 3.7 版本加入。

sys.getdefaultencoding()

返回 'utf-8'。這是預設字串編碼的名稱,用於 str.encode() 等方法。

sys.getdlopenflags()

返回用於 dlopen() 呼叫的標誌的當前值。標誌值的符號名稱可在 os 模組中找到(RTLD_xxx 常量,例如 os.RTLD_LAZY)。

可用性: Unix。

sys.getfilesystemencoding()

獲取檔案系統編碼:與檔案系統錯誤處理程式一起用於在 Unicode 檔名和位元組檔名之間進行轉換的編碼。檔案系統錯誤處理程式透過 getfilesystemencodeerrors() 返回。

為了獲得最佳相容性,在所有情況下都應使用 str 作為檔名,儘管也支援將檔案名錶示為位元組。接受或返回檔名的函式應支援 str 或 bytes,並在內部轉換為系統首選的表示形式。

應使用 os.fsencode()os.fsdecode() 來確保使用正確的編碼和錯誤模式。

檔案系統編碼和錯誤處理程式 在 Python 啟動時由 PyConfig_Read() 函式配置:參見 filesystem_encodingfilesystem_errors 的成員 PyConfig

3.2 版中已更改: getfilesystemencoding() 結果不再可以是 None

3.6 版中已更改: Windows 不再保證返回 'mbcs'。有關更多資訊,請參閱 PEP 529_enablelegacywindowsfsencoding()

3.7 版中已更改: 如果啟用了 Python UTF-8 模式,則返回 'utf-8'

sys.getfilesystemencodeerrors()

獲取檔案系統錯誤處理程式:與檔案系統編碼一起用於在 Unicode 檔名和位元組檔名之間進行轉換的錯誤處理程式。檔案系統編碼透過 getfilesystemencoding() 返回。

應使用 os.fsencode()os.fsdecode() 來確保使用正確的編碼和錯誤模式。

檔案系統編碼和錯誤處理程式 在 Python 啟動時由 PyConfig_Read() 函式配置:參見 filesystem_encodingfilesystem_errors 的成員 PyConfig

在 3.6 版本加入。

sys.get_int_max_str_digits()

返回整數字符串轉換長度限制的當前值。另請參見 set_int_max_str_digits()

在 3.11 版本中新增。

sys.getrefcount(object)

返回 *object* 的引用計數。返回的計數通常比您預期的要高一個,因為它包括作為 getrefcount() 引數的(臨時)引用。

請注意,返回的值可能無法真正反映物件實際持有的引用數量。例如,某些物件是不朽的,並且具有非常高的引用計數,這並不反映實際的引用數量。因此,除了 0 或 1 的值外,不要依賴返回值的準確性。

CPython 實現細節: 具有大引用計數的不朽物件可以透過 _is_immortal() 來識別。

3.12 版中已更改: 不朽物件的引用計數非常大,與物件的實際引用數量不匹配。

sys.getrecursionlimit()

返回遞迴限制的當前值,即 Python 直譯器堆疊的最大深度。此限制可防止無限遞迴導致 C 堆疊溢位並使 Python 崩潰。它可以透過 setrecursionlimit() 設定。

sys.getsizeof(object[, default])

返回物件以位元組為單位的大小。該物件可以是任何型別的物件。所有內建物件將返回正確的結果,但這對於第三方擴充套件可能不適用,因為它與實現有關。

只計算直接歸因於物件的記憶體消耗,不包括它引用的物件的記憶體消耗。

如果給定,如果物件不提供檢索大小的方法,則返回 *default*。否則將引發 TypeError

getsizeof() 呼叫物件的 __sizeof__ 方法,如果物件由垃圾回收器管理,則會增加額外的垃圾回收器開銷。

請參閱 recursive sizeof recipe,瞭解如何遞迴使用 getsizeof() 來查詢容器及其所有內容大小的示例。

sys.getswitchinterval()

返回直譯器的“執行緒切換間隔”秒數;參見 setswitchinterval()

在 3.2 版本加入。

sys._getframe([depth])

從呼叫堆疊返回一個幀物件。如果給定可選整數 *depth*,則返回比堆疊頂部低 *depth* 個呼叫的幀物件。如果深度超過呼叫堆疊,則會引發 ValueError。*depth* 的預設值為零,返回呼叫堆疊頂部的幀。

引發帶有引數 frame審計事件 sys._getframe

CPython 實現細節: 此函式僅應內部和特殊目的使用。它不保證在所有 Python 實現中都存在。

sys._getframemodulename([depth])

從呼叫棧返回模組名稱。如果提供了可選整數 depth,則返回比棧頂多 depth 個呼叫的模組。如果超出呼叫棧深度,或者模組無法識別,則返回 Nonedepth 的預設值為零,返回呼叫棧頂部的模組。

引發一個帶引數 depth審計事件 sys._getframemodulename

CPython 實現細節: 此函式僅應內部和特殊目的使用。它不保證在所有 Python 實現中都存在。

3.12 新版功能.

sys.getobjects(limit[, type])

此函式僅在 CPython 使用專門的配置選項 --with-trace-refs 構建時才存在。它僅用於除錯垃圾回收問題。

返回最多 limit 個動態分配的 Python 物件的列表。如果給定了 type,則只包含該精確型別(不包括子型別)的物件。

列表中的物件不安全,請勿使用。具體來說,結果將包含所有共享物件分配器狀態的直譯器(即,使用 PyInterpreterConfig.use_main_obmalloc 設定為 1 或使用 Py_NewInterpreter() 建立的直譯器,以及主直譯器)中的物件。混合來自不同直譯器的物件可能導致崩潰或其他意外行為。

CPython 實現細節: 此函式僅應用於特殊目的。它不保證在所有 Python 實現中都存在。

3.14 版本中的變化: 結果可能包含來自其他直譯器的物件。

sys.getprofile()

獲取由 setprofile() 設定的分析器函式。

sys.gettrace()

獲取由 settrace() 設定的跟蹤函式。

CPython 實現細節: gettrace() 函式僅用於實現偵錯程式、分析器、程式碼覆蓋工具等。其行為是實現平臺的一部分,而非語言定義的一部分,因此可能並非在所有 Python 實現中都可用。

sys.getwindowsversion()

返回一個命名元組,描述當前執行的 Windows 版本。命名元素包括 majorminorbuildplatformservice_packservice_pack_minorservice_pack_majorsuite_maskproduct_typeplatform_versionservice_pack 包含一個字串,platform_version 包含一個 3 元組,所有其他值都是整數。這些元件也可以透過名稱訪問,因此 sys.getwindowsversion()[0] 等同於 sys.getwindowsversion().major。為了與以前的版本相容,只有前 5 個元素可以透過索引檢索。

platform 將是 2 (VER_PLATFORM_WIN32_NT)。

product_type 可以是以下值之一

常量

含義

1 (VER_NT_WORKSTATION)

系統是工作站。

2 (VER_NT_DOMAIN_CONTROLLER)

系統是域控制器。

3 (VER_NT_SERVER)

系統是伺服器,但不是域控制器。

此函式包裝了 Win32 GetVersionEx() 函式;有關這些欄位的更多資訊,請參閱 Microsoft 文件中的 OSVERSIONINFOEX()

platform_version 返回當前作業系統的主要版本、次要版本和構建號,而不是為程序模擬的版本。它旨在用於日誌記錄,而不是用於功能檢測。

備註

platform_version 從 kernel32.dll 獲取版本,該版本可能與 OS 版本不同。請使用 platform 模組來獲取準確的作業系統版本。

可用性: Windows。

3.2 版本中的變化: 更改為命名元組,並添加了 service_pack_minorservice_pack_majorsuite_maskproduct_type

3.6 版本中的變化: 添加了 platform_version

sys.get_asyncgen_hooks()

返回一個 asyncgen_hooks 物件,它類似於 (firstiter, finalizer) 形式的 namedtuple,其中 firstiterfinalizer 預期為 None 或接受一個 非同步生成器迭代器 作為引數的函式,用於透過事件迴圈排程非同步生成器的終結。

3.6 新增: 有關更多詳細資訊,請參閱 PEP 525

備註

此函式已在臨時基礎上新增 (詳見 PEP 411)。

sys.get_coroutine_origin_tracking_depth()

獲取由 set_coroutine_origin_tracking_depth() 設定的當前協程源跟蹤深度。

在 3.7 版本加入。

備註

此函式已在臨時基礎上新增 (詳見 PEP 411)。僅用於除錯目的。

sys.hash_info

一個 命名元組,給出數字雜湊實現的引數。有關數字型別雜湊的更多詳細資訊,請參閱 數字型別的雜湊

hash_info.width

用於雜湊值的位數寬度

hash_info.modulus

用於數字雜湊方案的素數模 P

hash_info.inf

正無窮大的雜湊值

hash_info.nan

(此屬性不再使用)

hash_info.imag

用於複數虛部的乘數

hash_info.algorithm

用於 str、bytes 和 memoryview 的雜湊演算法名稱

hash_info.hash_bits

雜湊演算法的內部輸出大小

hash_info.seed_bits

雜湊演算法種子金鑰的大小

在 3.2 版本加入。

3.4 版本中的變化: 添加了 algorithmhash_bitsseed_bits

sys.hexversion

版本號編碼為單個整數。這保證隨著每個版本的增加而增加,包括對非生產版本的正確支援。例如,要測試 Python 直譯器至少是 1.5.2 版本,請使用

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

這被稱為 hexversion,因為它只有在將其傳遞給內建的 hex() 函式時才真正有意義。命名元組 sys.version_info 可用於更人性化的相同資訊編碼。

有關 hexversion 的更多詳細資訊,請參閱 API 和 ABI 版本控制

sys.implementation

一個物件,包含有關當前執行的 Python 直譯器實現的資訊。所有 Python 實現都必須具有以下屬性。

name 是實現的識別符號,例如 'cpython'。實際字串由 Python 實現定義,但保證為小寫。

version 是一個命名元組,格式與 sys.version_info 相同。它代表 Python 實現 的版本。這與當前執行的直譯器所遵循的 Python 語言 的特定版本有不同的含義,後者由 sys.version_info 表示。例如,對於 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)。對於 CPython,它們是相同的值,因為它是一個參考實現。

hexversion 是實現版本的十六進位制格式,類似於 sys.hexversion

cache_tag 是匯入機制在快取模組檔名中使用的標籤。按照慣例,它將是實現的名稱和版本的組合,例如 'cpython-33'。但是,Python 實現可以根據需要使用其他值。如果 cache_tag 設定為 None,則表示應停用模組快取。

supports_isolated_interpreters 是一個布林值,表示此實現是否支援多個隔離直譯器。對於大多數平臺上的 CPython,它為 True。支援此功能的平臺實現了低階 _interpreters 模組。

sys.implementation 可能包含特定於 Python 實現的其他屬性。這些非標準屬性必須以下劃線開頭,此處不作描述。無論其內容如何,sys.implementation 在直譯器執行期間或在實現版本之間都不會更改。(但是,它可能在 Python 語言版本之間發生更改。)有關更多資訊,請參閱 PEP 421

在 3.3 版本加入。

3.14 版本中的變化: 添加了 supports_isolated_interpreters 欄位。

備註

新增新的必需屬性必須透過正常的 PEP 流程。有關更多資訊,請參閱 PEP 421

sys.int_info

一個 命名元組,包含有關 Python 內部整數表示的資訊。屬性是隻讀的。

int_info.bits_per_digit

每個數字中包含的位數。Python 整數在內部以 2**int_info.bits_per_digit 為基數儲存。

int_info.sizeof_digit

用於表示數字的 C 型別的大小(以位元組為單位)。

int_info.default_max_str_digits

當未明確配置時,sys.get_int_max_str_digits() 的預設值。

int_info.str_digits_check_threshold

sys.set_int_max_str_digits()PYTHONINTMAXSTRDIGITS-X int_max_str_digits 的最小非零值。

在 3.1 版本加入。

3.11 版本中的變化: 添加了 default_max_str_digitsstr_digits_check_threshold

sys.__interactivehook__

當此屬性存在時,當直譯器以 互動模式 啟動時,其值會自動呼叫(不帶引數)。這在讀取 PYTHONSTARTUP 檔案之後進行,這樣您就可以在那裡設定此鉤子。site 模組設定此項

當鉤子在啟動時被呼叫時,引發一個帶鉤子物件作為引數的 審計事件 cpython.run_interactivehook

在 3.4 版本加入。

sys.intern(string)

string 輸入“駐留”字串表並返回駐留字串——即 string 本身或其副本。駐留字串對於字典查詢可以提高一點效能——如果字典中的鍵是駐留的,並且查詢鍵也是駐留的,則鍵比較(在雜湊之後)可以透過指標比較而不是字串比較來完成。通常,Python 程式中使用的名稱會自動駐留,並且用於儲存模組、類或例項屬性的字典具有駐留鍵。

駐留字串不是 永恆的;您必須保留對 intern() 返回值的引用才能從中受益。

sys._is_gil_enabled()

如果 GIL 已啟用,則返回 True;如果已停用,則返回 False

在 3.13 版本加入。

CPython 實現細節: 它不保證在所有 Python 實現中都存在。

sys.is_finalizing()

如果主 Python 直譯器正在 關閉,則返回 True。否則返回 False

另請參閱 PythonFinalizationError 異常。

在 3.5 版本加入。

sys._jit

用於觀察即時編譯的實用工具。

CPython 實現細節: JIT 編譯是 CPython 的一個 實驗性實現細節sys._jit 不保證在所有 Python 實現、版本或構建配置中都存在或以相同方式執行。

在 3.14 版本加入。

_jit.is_available()

如果當前的 Python 可執行檔案支援 JIT 編譯,則返回 True,否則返回 False。這可以透過在 Windows 上使用 --experimental-jit 選項,在所有其他平臺上使用 --enable-experimental-jit 選項構建 CPython 來控制。

_jit.is_enabled()

如果當前 Python 程序已啟用 JIT 編譯(意味著 sys._jit.is_available()),則返回 True,否則返回 False。如果 JIT 編譯可用,可以透過在直譯器啟動時將 PYTHON_JIT 環境變數設定為 0(停用)或 1(啟用)來控制。

_jit.is_active()

如果最頂層的 Python 幀當前正在執行 JIT 程式碼(意味著 sys._jit.is_enabled()),則返回 True,否則返回 False

備註

此函式僅用於測試和除錯 JIT 本身。應避免用於任何其他目的。

備註

由於追蹤 JIT 編譯器的特性,重複呼叫此函式可能會產生令人驚訝的結果。例如,根據其返回值進行分支很可能導致意外行為(如果這樣做會導致 JIT 程式碼進入或退出)。

>>> for warmup in range(BIG_NUMBER):
...     # This line is "hot", and is eventually JIT-compiled:
...     if sys._jit.is_active():
...         # This line is "cold", and is run in the interpreter:
...         assert sys._jit.is_active()
...
Traceback (most recent call last):
  File "<stdin>", line 5, in <module>
    assert sys._jit.is_active()
           ~~~~~~~~~~~~~~~~~~^^
AssertionError
sys.last_exc

此變數並非總是定義;當異常未處理且直譯器列印錯誤訊息和棧回溯時,它被設定為異常例項。其目的是允許互動使用者匯入偵錯程式模組並進行事後除錯,而無需重新執行導致錯誤的命令。(典型用法是 import pdb; pdb.pm() 以進入事後偵錯程式;有關更多資訊,請參閱 pdb 模組。)

3.12 新版功能.

sys._is_immortal(op)

如果給定物件是 永恆的,則返回 True,否則返回 False

備註

對於不朽物件(因此傳遞給此函式時返回 True),不保證在未來版本中仍然不朽,對於有限物件也是如此。

在 3.14 版本加入。

CPython 實現細節: 此函式僅應用於特殊目的。它不保證在所有 Python 實現中都存在。

sys._is_interned(string)

如果給定的字串是“駐留的”,則返回 True,否則返回 False

在 3.13 版本加入。

CPython 實現細節: 它不保證在所有 Python 實現中都存在。

sys.last_type
sys.last_value
sys.last_traceback

這三個變數已棄用;請改用 sys.last_exc。它們儲存了 sys.last_exc 的舊版表示,如上文 exc_info() 所返回。

sys.maxsize

一個整數,表示 Py_ssize_t 型別變數可取的最大值。在 32 位平臺上通常是 2**31 - 1,在 64 位平臺上是 2**63 - 1

sys.maxunicode

一個整數,表示最大的 Unicode 碼點值,即 1114111(十六進位制為 0x10FFFF)。

3.3 版本中的變化: PEP 393 之前,sys.maxunicode 曾經是 0xFFFF0x10FFFF,具體取決於指定 Unicode 字元是儲存為 UCS-2 還是 UCS-4 的配置選項。

sys.meta_path

一個 元路徑查詢器 物件列表,這些物件的 find_spec() 方法會被呼叫,以檢視其中一個物件是否可以找到要匯入的模組。預設情況下,它包含實現 Python 預設匯入語義的條目。呼叫 find_spec() 方法時至少會傳入要匯入模組的絕對名稱。如果被匯入模組包含在一個包中,則父包的 __path__ 屬性將作為第二個引數傳入。該方法返回一個 模組規格,如果找不到模組則返回 None

參見

importlib.abc.MetaPathFinder

定義 meta_path 上查詢器物件介面的抽象基類。

importlib.machinery.ModuleSpec

find_spec() 應該返回其例項的具體類。

3.4 版本中的變化: 模組規格 在 Python 3.4 中由 PEP 451 引入。

3.12 版本中的變化: 如果 meta_path 條目沒有 find_spec() 方法,則移除了尋找 find_module() 方法的備用方案。

sys.modules

這是一個字典,將模組名稱對映到已載入的模組。它可以被操作以強制重新載入模組和其他技巧。然而,替換字典不一定會按預期工作,並且從字典中刪除基本項可能導致 Python 失敗。如果要遍歷此全域性字典,請始終使用 sys.modules.copy()tuple(sys.modules) 以避免異常,因為其大小可能在迭代期間因程式碼或其他執行緒中的活動而更改。

sys.orig_argv

傳遞給 Python 可執行檔案的原始命令列引數列表。

sys.orig_argv 的元素是 Python 直譯器的引數,而 sys.argv 的元素是使用者程式的引數。直譯器本身消耗的引數將出現在 sys.orig_argv 中,並從 sys.argv 中缺失。

在 3.10 版本加入。

sys.path

一個字串列表,指定模組的搜尋路徑。從環境變數 PYTHONPATH 以及一個與安裝相關的預設值初始化。

預設情況下,在程式啟動時初始化時,一個潛在不安全的路徑會預置到 sys.pathPYTHONPATH 而插入的條目之前)

  • python -m module 命令列:預置當前工作目錄。

  • python script.py 命令列:預置指令碼的目錄。如果是符號連結,則解析符號連結。

  • python -c codepython (REPL) 命令列:預置空字串,表示當前工作目錄。

要不預置此潛在不安全的路徑,請使用 -P 命令列選項或 PYTHONSAFEPATH 環境變數。

程式可以自由修改此列表以達到自己的目的。只有字串應新增到 sys.path;所有其他資料型別在匯入期間將被忽略。

參見

  • 模組 site 這描述瞭如何使用 .pth 檔案來擴充套件 sys.path

sys.path_hooks

一個可呼叫物件列表,它們接受一個路徑引數,嘗試為該路徑建立一個 查詢器。如果可以建立查詢器,則由可呼叫物件返回,否則引發 ImportError

最初在 PEP 302 中指定。

sys.path_importer_cache

一個字典,用作 查詢器 物件的快取。鍵是已傳遞給 sys.path_hooks 的路徑,值是找到的查詢器。如果路徑是有效的檔案系統路徑,但在 sys.path_hooks 上沒有找到查詢器,則儲存 None

最初在 PEP 302 中指定。

sys.platform

一個包含平臺識別符號的字串。已知的值如下:

系統

platform

AIX

'aix'

Android

'android'

Emscripten

'emscripten'

FreeBSD

'freebsd'

iOS

'ios'

Linux

'linux'

macOS

'darwin'

Windows

'win32'

Windows/Cygwin

'cygwin'

WASI

'wasi'

在表中未列出的 Unix 系統上,該值為 uname -s 返回的小寫 OS 名稱,並附加 uname -r 返回的版本的第一部分,例如 'sunos5'在 Python 構建時。除非您想測試特定的系統版本,否則建議使用以下慣用法:

if sys.platform.startswith('sunos'):
    # SunOS-specific code here...

3.3 版本中的變化: 在 Linux 上,sys.platform 不再包含主版本號。它總是 'linux',而不是 'linux2''linux3'

3.8 版本中的變化: 在 AIX 上,sys.platform 不再包含主版本號。它總是 'aix',而不是 'aix5''aix7'

3.13 版本中的變化: 在 Android 上,sys.platform 現在返回 'android' 而不是 'linux'

3.14 版本中的變化: 在 FreeBSD 上,sys.platform 不再包含主要版本號。它總是 'freebsd',而不是 'freebsd13''freebsd14'

參見

os.name 具有更粗的粒度。os.uname() 提供與系統相關的版本資訊。

platform 模組提供了對系統身份的詳細檢查。

sys.platlibdir

平臺特定庫目錄的名稱。它用於構建標準庫的路徑和已安裝擴充套件模組的路徑。

在大多數平臺上,它等於 "lib"。在 Fedora 和 SuSE 上,在 64 位平臺上它等於 "lib64",這會產生以下 sys.path 路徑(其中 X.Y 是 Python major.minor 版本)

  • /usr/lib64/pythonX.Y/:標準庫(如 os 模組的 os.py

  • /usr/lib64/pythonX.Y/lib-dynload/:標準庫的 C 擴充套件模組(如 errno 模組,確切的檔名與平臺相關)

  • /usr/lib/pythonX.Y/site-packages/(始終使用 lib,而不是 sys.platlibdir):第三方模組

  • /usr/lib64/pythonX.Y/site-packages/:第三方包的 C 擴充套件模組

在 3.9 版本中新增。

sys.prefix

一個字串,給出平臺無關的 Python 檔案安裝的站點特定目錄字首;在 Unix 上,預設值為 /usr/local。這可以在構建時使用 configure 指令碼的 --prefix 引數進行設定。有關派生路徑的資訊,請參閱 安裝路徑

備註

如果 虛擬環境 生效,此 prefix 將指向虛擬環境。Python 安裝的值仍可透過 base_prefix 獲得。有關更多資訊,請參閱 虛擬環境

3.14 版中已更改: 虛擬環境下執行時,prefixexec_prefix 現在由路徑初始化設定為虛擬環境字首,而不是 site。這意味著 prefixexec_prefix 始終指向虛擬環境,即使 site 被停用 (-S) 也是如此。

sys.ps1
sys.ps2

指定直譯器主提示符和次提示符的字串。僅當直譯器處於互動模式時才定義它們。在這種情況下,它們的初始值分別為 '>>> ''... '。如果將非字串物件分配給任一變數,則每次直譯器準備讀取新的互動式命令時,都會重新評估其 str();這可用於實現動態提示符。

sys.setdlopenflags(n)

設定直譯器用於 dlopen() 呼叫的標誌,例如當直譯器載入擴充套件模組時。除此之外,如果呼叫為 sys.setdlopenflags(0),這將啟用匯入模組時符號的延遲解析。要在擴充套件模組之間共享符號,請呼叫為 sys.setdlopenflags(os.RTLD_GLOBAL)。標誌值的符號名稱可在 os 模組中找到(RTLD_xxx 常量,例如 os.RTLD_LAZY)。

可用性: Unix。

sys.set_int_max_str_digits(maxdigits)

設定此直譯器使用的 整數字符串轉換長度限制。另請參見 get_int_max_str_digits()

在 3.11 版本中新增。

sys.setprofile(profilefunc)

設定系統的配置檔案函式,它允許您用 Python 實現一個 Python 原始碼分析器。有關 Python 分析器的更多資訊,請參閱 Python 分析器 一章。系統的配置檔案函式的呼叫方式類似於系統的跟蹤函式(參見 settrace()),但它是用不同的事件呼叫的,例如,它不會為每個執行的程式碼行呼叫(只在呼叫和返回時呼叫,但即使已設定異常,也會報告返回事件)。該函式是執行緒特定的,但分析器無法知道執行緒之間的上下文切換,因此在存在多個執行緒的情況下使用它沒有意義。此外,它的返回值不使用,因此它可以簡單地返回 None。配置檔案函式中的錯誤將導致其自身取消設定。

備註

settrace() 相同,setprofile() 也使用相同的跟蹤機制。要在跟蹤函式(例如在偵錯程式斷點中)內部使用 setprofile() 跟蹤呼叫,請參見 call_tracing()

配置檔案函式應有三個引數:frameeventargframe 是當前棧幀。event 是一個字串:'call''return''c_call''c_return''c_exception'arg 取決於事件型別。

事件的含義如下

'call'

函式被呼叫(或進入其他程式碼塊)。配置檔案函式被呼叫;argNone

'return'

函式(或其他程式碼塊)即將返回。配置檔案函式被呼叫;arg 是將返回的值,如果事件是由引發異常引起的,則為 None

'c_call'

C 函式即將被呼叫。這可能是擴充套件函式或內建函式。arg 是 C 函式物件。

'c_return'

C 函式已返回。arg 是 C 函式物件。

'c_exception'

C 函式已引發異常。arg 是 C 函式物件。

引發一個不帶引數的 審計事件 sys.setprofile

sys.setrecursionlimit(limit)

將 Python 直譯器棧的最大深度設定為 limit。此限制可防止無限遞迴導致 C 棧溢位並使 Python 崩潰。

可能的最高限制取決於平臺。當程式需要深層遞迴且平臺支援更高限制時,使用者可能需要將限制設定得更高。這應謹慎進行,因為過高的限制可能導致崩潰。

如果新限制在當前遞迴深度下過低,則會引發 RecursionError 異常。

3.5.1 版本中的變化: 如果新限制在當前遞迴深度下過低,現在會引發 RecursionError 異常。

sys.setswitchinterval(interval)

設定直譯器的執行緒切換間隔(以秒為單位)。此浮點值確定分配給併發執行的 Python 執行緒的“時間片”的理想持續時間。請注意,實際值可能更高,特別是如果使用了長時間執行的內部函式或方法。此外,在間隔結束時哪個執行緒被排程是作業系統的決定。直譯器沒有自己的排程器。

在 3.2 版本加入。

sys.settrace(tracefunc)

設定系統的跟蹤函式,它允許您用 Python 實現一個 Python 原始碼偵錯程式。該函式是執行緒特定的;對於支援多執行緒的偵錯程式,它必須使用 settrace() 為每個被除錯的執行緒註冊一個跟蹤函式,或者使用 threading.settrace()

跟蹤函式應有三個引數:frameeventargframe當前棧幀event 是一個字串:'call''line''return''exception''opcode'arg 取決於事件型別。

每當進入新的區域性作用域時,跟蹤函式就會被呼叫(event 設定為 'call');它應該返回一個引用,指向用於新作用域的區域性跟蹤函式,或者如果該作用域不應被跟蹤,則返回 None

區域性跟蹤函式應返回對自身的引用,或返回對另一個函式的引用,該函式將用作該作用域的區域性跟蹤函式。

如果在跟蹤函式中發生任何錯誤,它將被取消設定,就像呼叫了 settrace(None) 一樣。

備註

在呼叫跟蹤函式時(例如,透過 settrace() 設定的函式),跟蹤功能被停用。有關遞迴跟蹤的資訊,請參閱 call_tracing()

事件的含義如下

'call'

呼叫函式(或進入其他程式碼塊)。全域性跟蹤函式被呼叫;argNone;返回值指定區域性跟蹤函式。

'line'

直譯器即將執行一行新程式碼或重新執行迴圈條件。區域性跟蹤函式被呼叫;argNone;返回值指定新的區域性跟蹤函式。有關其工作原理的詳細解釋,請參見 Objects/lnotab_notes.txt。可以透過將 f_trace_lines 設定為該 上的 False 來停用幀的逐行事件。

'return'

一個函式(或其它程式碼塊)即將返回。區域性跟蹤函式被呼叫;arg 是將返回的值,如果事件是由引發異常引起的,則為 None。跟蹤函式的返回值被忽略。

'exception'

發生異常。區域性跟蹤函式被呼叫;arg 是一個元組 (exception, value, traceback);返回值指定新的區域性跟蹤函式。

'opcode'

直譯器即將執行一個新的操作碼(有關操作碼的詳細資訊,請參見 dis)。區域性跟蹤函式被呼叫;argNone;返回值指定新的區域性跟蹤函式。逐操作碼事件預設不發出:它們必須透過在 上將 f_trace_opcodes 明確設定為 True 來請求。

請注意,當異常沿著呼叫者鏈傳播時,每個級別都會生成一個 'exception' 事件。

為了更精細的使用,可以透過顯式分配 frame.f_trace = tracefunc 來設定跟蹤函式,而不是依賴於透過已安裝的跟蹤函式的返回值間接設定。這對於啟用當前幀上的跟蹤函式也是必需的,而 settrace() 不會這樣做。請注意,為了使其工作,必須使用 settrace() 安裝一個全域性跟蹤函式以啟用執行時跟蹤機制,但它不需要是相同的跟蹤函式(例如,它可以是一個低開銷的跟蹤函式,簡單地返回 None 以在每個幀上立即停用自身)。

有關程式碼和幀物件的更多資訊,請參閱 標準型別層次結構

引發一個不帶引數的 審計事件 sys.settrace

CPython 實現細節: settrace() 函式僅用於實現偵錯程式、分析器、程式碼覆蓋工具等。其行為是實現平臺的一部分,而非語言定義的一部分,因此可能並非在所有 Python 實現中都可用。

3.7 版本中的變化: 添加了 'opcode' 事件型別;為幀添加了 f_trace_linesf_trace_opcodes 屬性

sys.set_asyncgen_hooks([firstiter] [, finalizer])

接受兩個可選的關鍵字引數,它們是接受一個 非同步生成器迭代器 作為引數的可呼叫物件。firstiter 可呼叫物件將在非同步生成器第一次迭代時被呼叫。finalizer 將在非同步生成器即將被垃圾回收時被呼叫。

引發一個不帶引數的 審計事件 sys.set_asyncgen_hooks_firstiter

引發一個不帶引數的 審計事件 sys.set_asyncgen_hooks_finalizer

之所以引發兩個審計事件,是因為底層 API 由兩次呼叫組成,每次呼叫都必須引發自己的事件。

3.6 新增: 有關更多詳細資訊,請參閱 PEP 525,有關 finalizer 方法的參考示例,請參閱 Lib/asyncio/base_events.pyasyncio.Loop.shutdown_asyncgens 的實現

備註

此函式已在臨時基礎上新增 (詳見 PEP 411)。

sys.set_coroutine_origin_tracking_depth(depth)

允許啟用或停用協程源跟蹤。啟用後,協程物件上的 cr_origin 屬性將包含一個 (filename, line number, function name) 元組的元組,描述協程物件建立時的回溯,最近的呼叫排在最前面。停用後,cr_origin 將為 None

要啟用,請傳遞一個大於零的 depth 值;這會設定將捕獲的幀數資訊。要停用,請將 depth 設定為零。

此設定是執行緒特定的。

在 3.7 版本加入。

備註

此函式已在臨時基礎上新增 (詳見 PEP 411)。僅用於除錯目的。

sys.activate_stack_trampoline(backend, /)

啟用棧分析器跳板 backend。唯一支援的後端是 "perf"

如果 JIT 處於活動狀態,則無法啟用棧跳板。

可用性: Linux。

3.12 新版功能.

sys.deactivate_stack_trampoline()

停用當前的棧分析器跳板後端。

如果未啟用棧分析器,此函式無效。

可用性: Linux。

3.12 新版功能.

sys.is_stack_trampoline_active()

如果棧分析器跳板處於活動狀態,則返回 True

可用性: Linux。

3.12 新版功能.

sys.remote_exec(pid, script)

在給定 pid 的遠端程序中執行包含 Python 程式碼的檔案 script

此函式立即返回,程式碼將在目標程序的主執行緒在下一個可用機會執行,類似於訊號的處理方式。沒有介面可以確定程式碼何時已執行。呼叫者負責確保檔案在遠端程序嘗試讀取時仍然存在,並且沒有被覆蓋。

遠端程序必須執行與本地程序相同主要和次要版本的 CPython 直譯器。如果本地或遠端直譯器是預釋出版本(alpha、beta 或候選版本),則本地和遠端直譯器必須是完全相同的版本。

當代碼在遠端程序中執行時,會引發一個 審計事件 sys.remote_exec,帶有 pid 和指令碼檔案的路徑。此事件在呼叫 sys.remote_exec() 的程序中引發。

當指令碼在遠端程序中執行時,會引發一個 審計事件 cpython.remote_debugger_script,帶有遠端程序中的路徑。此事件在遠端程序中引發,而不是呼叫 sys.remote_exec() 的程序中引發。

可用性: Unix, Windows。

在 3.14 版本加入。

sys._enablelegacywindowsfsencoding()

檔案系統編碼和錯誤處理程式 分別更改為 'mbcs' 和 'replace',以與 Python 3.6 之前的版本保持一致。

這相當於在啟動 Python 之前定義 PYTHONLEGACYWINDOWSFSENCODING 環境變數。

另請參閱 sys.getfilesystemencoding()sys.getfilesystemencodeerrors()

可用性: Windows。

備註

Python 啟動後更改檔案系統編碼有風險,因為舊的 fsencoding 或由舊的 fsencoding 編碼的路徑可能已快取在某個地方。請改用 PYTHONLEGACYWINDOWSFSENCODING

版本 3.6 新增: 有關詳情,請參閱 PEP 529

從 3.13 版本開始廢棄,將在 3.16 版本移除: 請改用 PYTHONLEGACYWINDOWSFSENCODING

sys.stdin
sys.stdout
sys.stderr

直譯器用於標準輸入、輸出和錯誤的檔案物件

  • stdin 用於所有互動式輸入(包括對 input() 的呼叫);

  • stdout 用於 print()表示式語句的輸出,以及 input() 的提示符;

  • 直譯器自身的提示符及其錯誤訊息輸出到 stderr

這些流是常規的文字檔案,類似於 open() 函式返回的檔案。它們的引數選擇如下:

  • 編碼和錯誤處理透過 PyConfig.stdio_encodingPyConfig.stdio_errors 進行初始化。

    在 Windows 上,控制檯裝置使用 UTF-8。非字元裝置,例如磁碟檔案和管道,使用系統區域設定編碼(即 ANSI 內碼表)。非控制檯字元裝置,例如 NUL(即 isatty() 返回 True 的情況),分別使用啟動時的控制檯輸入和輸出內碼表的值作為 stdin 和 stdout/stderr。如果程序最初未連線到控制檯,則預設為系統區域設定編碼

    可以透過在啟動 Python 之前設定環境變數 PYTHONLEGACYWINDOWSSTDIO 來覆蓋控制檯的特殊行為。在這種情況下,控制檯內碼表將像其他字元裝置一樣使用。

    在所有平臺上,您可以透過在啟動 Python 之前設定 PYTHONIOENCODING 環境變數,或者使用新的 -X utf8 命令列選項和 PYTHONUTF8 環境變數來覆蓋字元編碼。但是,對於 Windows 控制檯,這僅在 PYTHONLEGACYWINDOWSSTDIO 也被設定時適用。

  • 當互動式時,stdout 流是行緩衝的。否則,它像常規文字檔案一樣是塊緩衝的。stderr 流在兩種情況下都是行緩衝的。您可以透過傳入 -u 命令列選項或設定 PYTHONUNBUFFERED 環境變數使這兩個流都變為無緩衝。

版本 3.9 更改: 非互動式 stderr 現在是行緩衝而不是全緩衝。

備註

要從/向標準流寫入或讀取二進位制資料,請使用底層的二進位制 buffer 物件。例如,要將位元組寫入 stdout,請使用 sys.stdout.buffer.write(b'abc')

但是,如果您正在編寫一個庫(並且無法控制其程式碼將在何種上下文中執行),請注意標準流可能會被替換為類似 io.StringIO 的檔案物件,它們不支援 buffer 屬性。

sys.__stdin__
sys.__stdout__
sys.__stderr__

這些物件包含程式啟動時 stdinstderrstdout 的原始值。它們在終結化期間使用,並且無論 sys.std* 物件是否已被重定向,都可能對列印到實際的標準流有用。

它還可以用於將實際檔案恢復到已知可用的檔案物件,以防它們被損壞的物件覆蓋。但是,首選的方法是在替換流之前明確儲存先前的流,然後恢復已儲存的物件。

備註

在某些情況下,stdinstdoutstderr 以及原始值 __stdin____stdout____stderr__ 可以是 None。這通常適用於未連線到控制檯的 Windows GUI 應用程式以及使用 pythonw 啟動的 Python 應用程式。

sys.stdlib_module_names

一個包含標準庫模組名稱的凍結集合 (frozenset)。

它在所有平臺上都是相同的。在某些平臺上不可用的模組和在 Python 構建時停用的模組也都會列出。列出了所有模組型別:純 Python、內建、凍結和擴充套件模組。測試模組被排除在外。

對於包,只列出主包:子包和子模組不列出。例如,email 包被列出,但 email.mime 子包和 email.message 子模組不列出。

另請參閱 sys.builtin_module_names 列表。

在 3.10 版本加入。

sys.thread_info

一個包含執行緒實現資訊的具名元組

thread_info.name

執行緒實現的名稱

  • "nt": Windows 執行緒

  • "pthread": POSIX 執行緒

  • "pthread-stubs": 存根 POSIX 執行緒 (在不支援執行緒的 WebAssembly 平臺上)

  • "solaris": Solaris 執行緒

thread_info.lock

鎖實現的名稱

  • "semaphore": 鎖使用訊號量

  • "mutex+cond": 鎖使用互斥鎖和條件變數

  • 如果此資訊未知,則為 None

thread_info.version

執行緒庫的名稱和版本。它是一個字串,如果此資訊未知,則為 None

在 3.3 版本加入。

sys.tracebacklimit

當此變數設定為整數值時,它決定了當發生未處理異常時列印的回溯資訊的最大層數。預設值為 1000。當設定為 0 或更小時,所有回溯資訊都將被抑制,只打印異常型別和值。

sys.unraisablehook(unraisable, /)

處理一個無法引發的異常。

當發生異常但 Python 無法處理它時呼叫。例如,當解構函式引發異常或在垃圾回收期間(gc.collect())。

unraisable 引數具有以下屬性:

  • exc_type: 異常型別。

  • exc_value: 異常值,可以為 None

  • exc_traceback: 異常回溯,可以為 None

  • err_msg: 錯誤訊息,可以為 None

  • object: 導致異常的物件,可以為 None

預設的鉤子將 err_msgobject 格式化為:f'{err_msg}: {object!r}';如果 err_msgNone,則使用“Exception ignored in”錯誤訊息。

sys.unraisablehook() 可以被覆蓋以控制無法引發的異常如何處理。

參見

excepthook() 處理未捕獲的異常。

警告

使用自定義鉤子儲存 exc_value 可能會建立引用迴圈。當不再需要異常時,應明確清除它以打破引用迴圈。

使用自定義鉤子儲存 object 可能會使其復活,如果它被設定為正在終結化的物件。為避免物件復活,請在自定義鉤子完成後避免儲存 object

當發生無法處理的異常時,引發審計事件 sys.unraisablehook,引數為 hook, unraisableunraisable 物件與將傳遞給鉤子的物件相同。如果沒有設定鉤子,hook 可能為 None

在 3.8 版本加入。

sys.version

一個字串,包含 Python 直譯器的版本號以及構建號和所用編譯器的附加資訊。此字串在互動式直譯器啟動時顯示。不要從中提取版本資訊,而是使用 version_infoplatform 模組提供的函式。

sys.api_version

C API 版本,等同於 C 宏 PYTHON_API_VERSION。為向後相容而定義。

目前,此常量在新的 Python 版本中不會更新,對版本控制沒有用處。將來可能會改變。

sys.version_info

一個元組,包含版本號的五個元件:major (主版本號), minor (次版本號), micro (微版本號), releaselevel (釋出級別), 和 serial (序列號)。除了 releaselevel 之外,所有值都是整數;釋出級別是 'alpha', 'beta', 'candidate', 或 'final'。對應 Python 2.0 版本的 version_info 值為 (2, 0, 0, 'final', 0)。這些元件也可以透過名稱訪問,因此 sys.version_info[0] 等效於 sys.version_info.major 等。

版本 3.1 更改: 增加了具名元件屬性。

sys.warnoptions

這是警告框架的實現細節;請勿修改此值。有關警告框架的更多資訊,請參閱 warnings 模組。

sys.winver

在 Windows 平臺上用於形成登錄檔鍵的版本號。這在 Python DLL 中作為字串資源 1000 儲存。該值通常是正在執行的 Python 直譯器的主版本號和次版本號。它在 sys 模組中提供以供資訊參考;修改此值對 Python 使用的登錄檔鍵沒有影響。

可用性: Windows。

sys.monitoring

包含用於註冊回撥和控制監視事件的函式和常量的名稱空間。詳見 sys.monitoring

sys._xoptions

一個字典,包含透過 -X 命令列選項傳入的各種實現特定標誌。選項名稱如果明確給出,則對映到它們的值;否則對映到 True。示例:

$ ./python -Xa=b -Xc
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
{'a': 'b', 'c': True}

CPython 實現細節: 這是 CPython 特有的訪問透過 -X 傳遞的選項的方式。其他實現可能透過其他方式匯出它們,或者根本不匯出。

在 3.2 版本加入。

引文

[C99]

ISO/IEC 9899:1999。“程式語言 – C。”該標準的公開草案可在 https://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf 處獲得。