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.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
環境變數設定為True
或False
,但您可以自行設定以控制位元組碼檔案生成。
- 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
。
如果 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
,引數為hook
、type
、value
、traceback
。如果未設定鉤子,hook
可能為None
。如果任何鉤子引發派生自RuntimeError
的異常,則對鉤子的呼叫將被抑制。否則,審計鉤子異常將被報告為不可引發,並呼叫sys.excepthook
。參見
sys.unraisablehook()
函式處理不可引發的異常,而threading.excepthook()
函式處理由threading.Thread.run()
引發的異常。
- sys.__breakpointhook__¶
- sys.__displayhook__¶
- sys.__excepthook__¶
- sys.__unraisablehook__¶
這些物件包含程式啟動時
breakpointhook
、displayhook
、excepthook
和unraisablehook
的原始值。它們被儲存下來,以便在breakpointhook
、displayhook
和excepthook
、unraisablehook
被損壞或替代物件替換時可以恢復。3.7 版新增: __breakpointhook__
3.8 版新增: __unraisablehook__
- sys.exception()¶
當在異常處理程式執行期間(例如
except
或except*
子句)呼叫此函式時,它會返回此處理程式捕獲的異常例項。當異常處理程式相互巢狀時,只有最內部處理程式處理的異常可訪問。如果沒有異常處理程式正在執行,此函式返回
None
。在 3.11 版本中新增。
- sys.exc_info()¶
此函式返回已處理異常的舊式表示。如果當前正在處理異常
e
(因此exception()
會返回e
),則exc_info()
返回元組(type(e), e, e.__traceback__)
。也就是說,一個元組包含異常的型別(BaseException
的子類)、異常本身以及通常封裝異常最後發生時呼叫堆疊的追蹤物件。如果堆疊上的任何地方都沒有處理異常,則此函式返回一個包含三個
None
值的元組。3.11 版中已更改:
type
和traceback
欄位現在從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 版中已更改: 在虛擬環境下執行時,
prefix
和exec_prefix
現在由路徑初始化設定為虛擬環境字首,而不是site
。這意味著prefix
和exec_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¶
- flags.inspect¶
- flags.interactive¶
- flags.isolated¶
- flags.optimize¶
- flags.dont_write_bytecode¶
- flags.no_user_site¶
- flags.no_site¶
- flags.ignore_environment¶
- flags.verbose¶
- flags.bytes_warning¶
- flags.quiet¶
- flags.hash_randomization¶
- flags.dev_mode¶
- flags.utf8_mode¶
- flags.safe_path¶
- flags.int_max_str_digits¶
- flags.warn_default_encoding¶
- flags.gil¶
- flags.thread_inherit_context¶
- flags.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'
,則對於有限浮點數x
,repr(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_encoding
和filesystem_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_encoding
和filesystem_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 個呼叫的模組。如果超出呼叫棧深度,或者模組無法識別,則返回
None
。depth 的預設值為零,返回呼叫棧頂部的模組。引發一個帶引數
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 版本。命名元素包括 major、minor、build、platform、service_pack、service_pack_minor、service_pack_major、suite_mask、product_type 和 platform_version。service_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_minor、service_pack_major、suite_mask 和 product_type。
3.6 版本中的變化: 添加了 platform_version
- sys.get_asyncgen_hooks()¶
返回一個 asyncgen_hooks 物件,它類似於
(firstiter, finalizer)
形式的namedtuple
,其中 firstiter 和 finalizer 預期為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 版本中的變化: 添加了 algorithm、hash_bits 和 seed_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_digits
和str_digits_check_threshold
。
- sys.__interactivehook__¶
當此屬性存在時,當直譯器以 互動模式 啟動時,其值會自動呼叫(不帶引數)。這在讀取
PYTHONSTARTUP
檔案之後進行,這樣您就可以在那裡設定此鉤子。site
模組設定此項。當鉤子在啟動時被呼叫時,引發一個帶鉤子物件作為引數的 審計事件
cpython.run_interactivehook
。在 3.4 版本加入。
- sys.intern(string)¶
將 string 輸入“駐留”字串表並返回駐留字串——即 string 本身或其副本。駐留字串對於字典查詢可以提高一點效能——如果字典中的鍵是駐留的,並且查詢鍵也是駐留的,則鍵比較(在雜湊之後)可以透過指標比較而不是字串比較來完成。通常,Python 程式中使用的名稱會自動駐留,並且用於儲存模組、類或例項屬性的字典具有駐留鍵。
- 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
曾經是0xFFFF
或0x10FFFF
,具體取決於指定 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.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.path
(在 因PYTHONPATH
而插入的條目之前)python -m module
命令列:預置當前工作目錄。python script.py
命令列:預置指令碼的目錄。如果是符號連結,則解析符號連結。python -c code
和python
(REPL) 命令列:預置空字串,表示當前工作目錄。
要不預置此潛在不安全的路徑,請使用
-P
命令列選項或PYTHONSAFEPATH
環境變數。程式可以自由修改此列表以達到自己的目的。只有字串應新增到
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'
。
- sys.platlibdir¶
平臺特定庫目錄的名稱。它用於構建標準庫的路徑和已安裝擴充套件模組的路徑。
在大多數平臺上,它等於
"lib"
。在 Fedora 和 SuSE 上,在 64 位平臺上它等於"lib64"
,這會產生以下sys.path
路徑(其中X.Y
是 Pythonmajor.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 版中已更改: 在虛擬環境下執行時,
prefix
和exec_prefix
現在由路徑初始化設定為虛擬環境字首,而不是site
。這意味著prefix
和exec_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()
。配置檔案函式應有三個引數:frame、event 和 arg。frame 是當前棧幀。event 是一個字串:
'call'
、'return'
、'c_call'
、'c_return'
或'c_exception'
。arg 取決於事件型別。事件的含義如下
'call'
函式被呼叫(或進入其他程式碼塊)。配置檔案函式被呼叫;arg 為
None
。'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()
。跟蹤函式應有三個引數:frame、event 和 arg。frame 是 當前棧幀。event 是一個字串:
'call'
、'line'
、'return'
、'exception'
或'opcode'
。arg 取決於事件型別。每當進入新的區域性作用域時,跟蹤函式就會被呼叫(event 設定為
'call'
);它應該返回一個引用,指向用於新作用域的區域性跟蹤函式,或者如果該作用域不應被跟蹤,則返回None
。區域性跟蹤函式應返回對自身的引用,或返回對另一個函式的引用,該函式將用作該作用域的區域性跟蹤函式。
如果在跟蹤函式中發生任何錯誤,它將被取消設定,就像呼叫了
settrace(None)
一樣。備註
在呼叫跟蹤函式時(例如,透過
settrace()
設定的函式),跟蹤功能被停用。有關遞迴跟蹤的資訊,請參閱call_tracing()
。事件的含義如下
'call'
呼叫函式(或進入其他程式碼塊)。全域性跟蹤函式被呼叫;arg 為
None
;返回值指定區域性跟蹤函式。'line'
直譯器即將執行一行新程式碼或重新執行迴圈條件。區域性跟蹤函式被呼叫;arg 為
None
;返回值指定新的區域性跟蹤函式。有關其工作原理的詳細解釋,請參見Objects/lnotab_notes.txt
。可以透過將f_trace_lines
設定為該 幀 上的False
來停用幀的逐行事件。'return'
一個函式(或其它程式碼塊)即將返回。區域性跟蹤函式被呼叫;arg 是將返回的值,如果事件是由引發異常引起的,則為
None
。跟蹤函式的返回值被忽略。'exception'
發生異常。區域性跟蹤函式被呼叫;arg 是一個元組
(exception, value, traceback)
;返回值指定新的區域性跟蹤函式。'opcode'
直譯器即將執行一個新的操作碼(有關操作碼的詳細資訊,請參見
dis
)。區域性跟蹤函式被呼叫;arg 為None
;返回值指定新的區域性跟蹤函式。逐操作碼事件預設不發出:它們必須透過在 幀 上將f_trace_opcodes
明確設定為True
來請求。
請注意,當異常沿著呼叫者鏈傳播時,每個級別都會生成一個
'exception'
事件。為了更精細的使用,可以透過顯式分配
frame.f_trace = tracefunc
來設定跟蹤函式,而不是依賴於透過已安裝的跟蹤函式的返回值間接設定。這對於啟用當前幀上的跟蹤函式也是必需的,而settrace()
不會這樣做。請注意,為了使其工作,必須使用settrace()
安裝一個全域性跟蹤函式以啟用執行時跟蹤機制,但它不需要是相同的跟蹤函式(例如,它可以是一個低開銷的跟蹤函式,簡單地返回None
以在每個幀上立即停用自身)。有關程式碼和幀物件的更多資訊,請參閱 標準型別層次結構。
引發一個不帶引數的 審計事件
sys.settrace
。CPython 實現細節:
settrace()
函式僅用於實現偵錯程式、分析器、程式碼覆蓋工具等。其行為是實現平臺的一部分,而非語言定義的一部分,因此可能並非在所有 Python 實現中都可用。3.7 版本中的變化: 添加了
'opcode'
事件型別;為幀添加了f_trace_lines
和f_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.py 中
asyncio.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.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()
的呼叫);直譯器自身的提示符及其錯誤訊息輸出到
stderr
。
這些流是常規的文字檔案,類似於
open()
函式返回的檔案。它們的引數選擇如下:編碼和錯誤處理透過
PyConfig.stdio_encoding
和PyConfig.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__¶
這些物件包含程式啟動時
stdin
、stderr
和stdout
的原始值。它們在終結化期間使用,並且無論sys.std*
物件是否已被重定向,都可能對列印到實際的標準流有用。它還可以用於將實際檔案恢復到已知可用的檔案物件,以防它們被損壞的物件覆蓋。但是,首選的方法是在替換流之前明確儲存先前的流,然後恢復已儲存的物件。
備註
在某些情況下,
stdin
、stdout
和stderr
以及原始值__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_msg
和object
格式化為:f'{err_msg}: {object!r}'
;如果err_msg
為None
,則使用“Exception ignored in”錯誤訊息。sys.unraisablehook()
可以被覆蓋以控制無法引發的異常如何處理。參見
excepthook()
處理未捕獲的異常。警告
使用自定義鉤子儲存
exc_value
可能會建立引用迴圈。當不再需要異常時,應明確清除它以打破引用迴圈。使用自定義鉤子儲存
object
可能會使其復活,如果它被設定為正在終結化的物件。為避免物件復活,請在自定義鉤子完成後避免儲存object
。當發生無法處理的異常時,引發審計事件
sys.unraisablehook
,引數為 hook, unraisable。unraisable 物件與將傳遞給鉤子的物件相同。如果沒有設定鉤子,hook 可能為None
。在 3.8 版本加入。
- sys.version¶
一個字串,包含 Python 直譯器的版本號以及構建號和所用編譯器的附加資訊。此字串在互動式直譯器啟動時顯示。不要從中提取版本資訊,而是使用
version_info
和platform
模組提供的函式。
- 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.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 版本加入。
引文
ISO/IEC 9899:1999。“程式語言 – C。”該標準的公開草案可在 https://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf 處獲得。