1. 命令行與環境?

CPython 解析器會掃描命令行與環境用于獲取各種設置信息。

CPython implementation detail: 其他實現的命令行方案可能有所不同。 更多相關資源請參閱 其他實現

1.1. 命令行?

對 Python 發起調用時,你可以指定以下的任意選項:

python [-bBdEhiIOqsSuvVWx?] [-c command | -m module-name | script | - ] [args]

當然最常見的用例就是簡單地啟動執行一個腳本:

python myscript.py

1.1.1. 接口選項?

解釋器接口類似于 UNIX shell,但提供了一些額外的發起調用方法:

  • 當調用時附帶連接到某個 tty 設備的標準輸入時,它會提示輸入命令并執行它們,直到讀入一個 EOF(文件結束字符,其產生方式是在 UNIX 中按 Ctrl-D 或在 Windows 中按 Ctrl-Z, Enter。)

  • 當調用時附帶一個文件名參數或以一個文件作為標準輸入時,它會從該文件讀取并執行腳本程序。

  • 當調用時附帶一個目錄名參數時,它會從該目錄讀取并執行具有適當名稱的腳本程序。

  • 當調用時附帶 -c command 時,它會執行 command 所給出的 Python 語句。 在這里 command 可以包含以換行符分隔的多條語句。 請注意前導空格在 Python 語句中是有重要作用的!

  • 當調用時附帶 -m module-name 時,會在 Python 模塊路徑中查找指定的模塊,并將其作為腳本程序執行。

在非交互模式下,會對全部輸入先解析再執行。

一個接口選項會終結解釋器所讀入的選項列表,后續的所有參數將被放入 sys.argv -- 請注意其中首個元素即第零項 (sys.argv[0]) 會是一個表示程序源的字符串。

-c <command>?

執行 command 中的 Python 代碼。 command 可以為一條或以換行符分隔的多條語句,其中前導空格像在普通模塊代碼中一樣具有作用。

如果給出此選項,sys.argv 的首個元素將為 "-c" 并且當前目錄將被加入 sys.path 的開頭(以允許該目錄中的模塊作為最高層級模塊被導入)。

-m <module-name>?

sys.path 中搜索指定名稱的模塊并將其內容作為 __main__ 模塊來執行。

由于該參數為 module 名稱,你不應給出文件擴展名 (.py)。 模塊名稱應為絕對有效的 Python 模塊名稱,但具體實現可能并不總是強制要求這一點(例如它可能允許你使用包含連字符的名稱)。

包名稱(包括命名空間包)也允許使用。 當所提供的是包名稱而非普通模塊名稱時,解釋器將把 <pkg>.__main__ 作為主模塊來執行。 此行為特意被設計為與作為腳本參數傳遞給解釋器的目錄和 zip 文件的處理方式類似。

注解

此選項不適用于內置模塊和以 C 編寫的擴展模塊,因為它們并沒有對應的 Python 模塊文件。 但是它仍然適用于預編譯的模塊,即使沒有可用的初始源文件。

如果給出此選項,sys.argv 的首個元素將為模塊文件的完整路徑 (在定位模塊文件期間,首個元素將設為 "-m")。 與 -c 選項一樣,當前目錄將被加入 sys.path 的開頭。

-I 選項可用來在隔離模式下運行腳本,此模式中 sys.path 既不包含當前目錄也不包含用戶的 site-packages 目錄。 所有 PYTHON* 環境變量也會被忽略。

許多標準庫模塊都包含作為腳本執行時會被發起調用的代碼。 其中的一個例子是 timeit 模塊:

python -m timeit -s 'setup here' 'benchmarked code here'
python -m timeit -h # for details

參見

runpy.run_module()

Python 代碼可以直接使用的等效功能

PEP 338 -- 將模塊作為腳本執行

在 3.1 版更改: 提供包名稱來運行 __main__ 子模塊。

在 3.4 版更改: 同樣支持命名空間包

-

從標準輸入 (sys.stdin) 讀取命令。 如果標準輸入為一個終端,則使用 -i

如果給出此選項,sys.argv 的首個元素將為 "-" 并且當前目錄將被加入 sys.path 的開頭。

<script>

執行 script 中的 Python 代碼,該參數應為一個(絕對或相對)文件系統路徑,指向某個 Python 文件、包含 __main__.py 文件的目錄,或包含 __main__.py 文件的 zip 文件。

如果給出此選項,sys.argv 的首個元素將為在命令行中指定的腳本名稱。

如果腳本名稱直接指向一個 Python 文件,則包含該文件的目錄將被加入 sys.path 的開頭,并且該文件會被作為 __main__ 模塊來執行。

如果腳本名稱指向一個目錄或 zip 文件,則腳本名稱將被加入 sys.path 的開頭,并且該位置中的 __main__.py 文件會被作為 __main__ 模塊來執行。

-I 選項可用來在隔離模式下運行腳本,此模式中 sys.path 既不包含腳本所在目錄也不包含用戶的 site-packages 目錄。 所有 PYTHON* 環境變量也會被忽略。

參見

runpy.run_path()

Python 代碼可以直接使用的等效功能

如果沒有給出接口選項,則使用 -isys.argv[0] 將為空字符串 (""),并且當前目錄會被加入 sys.path 的開頭。 此外,tab 補全和歷史編輯會自動啟用,如果你的系統平臺支持此功能的話 (參見 Readline(類庫) 配置)。

在 3.4 版更改: 自動啟用 tab 補全和歷史編輯。

1.1.2. 通用選項?

-??
-h?
--help?

打印全部命令行選項的簡短描述。

-V?
--version?

打印 Python 版本號并退出。 示例輸出信息如下:

Python 3.7.0b2+

如果重復給出,則打印有關構建的更多信息,例如:

Python 3.7.0b2+ (3.7:0c076caaa8, Sep 22 2018, 12:04:24)
[GCC 6.2.0 20161005]

3.6 新版功能: -VV 選項。

1.1.3. 其他選項?

-b?

在將 bytesbytearraystr 或是將 bytesint 比較時發出警告。 如果重復給出該選項 (-bb) 則會引發錯誤。

在 3.5 版更改: 影響 bytesint 的比較。

-B?

如果給出此選項,Python 將不會試圖在導入源模塊時寫入 .pyc 文件。 另請參閱 PYTHONDONTWRITEBYTECODE

--check-hash-based-pycs default|always|never?

控制基于哈希值的 .pyc 文件的驗證行為。 參見 已緩存字節碼的失效。 當設為 default 時,已選定和未選定的基于哈希值的字節碼緩存文件將根據其默認語義進行驗證。 當設為 always 時,所有基于哈希值的 .pyc 文件,不論是已選定還是未選定的都將根據其對應的源文件進行驗證。 當設為 never 時,基于哈希值的 .pyc 文件將不會根據其對應的源文件進行驗證。

基于時間戳的 .pyc 文件的語義不會受此選項影響。

-d?

開啟解析器調試輸出(限專家使用,依賴于編譯選項)。 另請參閱 PYTHONDEBUG

-E?

忽略所有 PYTHON* 環境變量,例如可能已設置的 PYTHONPATHPYTHONHOME

-i?

當有腳本被作為首個參數傳入或使用了 -c 選項時,在執行腳本或命令之后進入交互模式,即使是在 sys.stdin 并不是一個終端的時候。 PYTHONSTARTUP 文件不會被讀取。

這一選項的用處是在腳本引發異常時檢查全局變量或者棧跟蹤。 另請參閱 PYTHONINSPECT

-I?

在隔離模式下運行 Python。 這將同時應用 -E 和 -s。 在隔離模式下 sys.path 既不包含腳本所在目錄也不包含用戶的 site-packages 目錄。 所有 PYTHON* 環境變量也會被忽略。 還可以施加更進一步的限制以防止用戶注入惡意代碼。

3.4 新版功能.

-O?

移除 assert 語句以及任何以 __debug__ 的值作為條件的代碼。 通過在 .pyc 擴展名之前添加 .opt-1 來擴充已編譯文件 (bytecode) 的文件名 (參見 PEP 488)。 另請參閱 PYTHONOPTIMIZE

在 3.5 版更改: 依據 PEP 488 修改 .pyc 文件名。

-OO?

在啟用 -O 的同時丟棄文檔字符串。 通過在 .pyc 擴展名之前添加 .opt-2 來擴展已編譯文件 (bytecode) 的文件名 (參見 PEP 488)。

在 3.5 版更改: 依據 PEP 488 修改 .pyc 文件名。

-q?

即使在交互模式下也不顯示版權和版本信息。

3.2 新版功能.

-R?

開啟哈希隨機化。 此選項權 PYTHONHASHSEED 環境變量設置為 0 時起作用,因為哈希隨機化是默認啟用的。

在先前的 Python 版本中,此選項會開啟哈希隨機化,這樣 str, bytes 和 datetime 的 __hash__() 值將會使用一個不可預測的隨機值來“加鹽”。 雖然它們在單個 Python 進程中會保持不變,但在重復發起的 Python 調用之間則是不可預測的。

哈希隨機化旨在針對由精心選擇的輸入引起的拒絕服務攻擊提供防護,這種輸入利用了構造 dict 在最壞情況下的性能即 O(n^2) 復雜度。 詳情請參閱 http://www.ocert.org/advisories/ocert-2011-003.html

PYTHONHASHSEED 允許你為哈希種子密碼設置一個固定值。

在 3.7 版更改: 此選項不會再被忽略。

3.2.3 新版功能.

-s?

不要將 用戶 site-packages 目錄 添加到 sys.path

參見

PEP 370 -- 分用戶的 site-packages 目錄

-S?

禁用 site 的導入及其所附帶的基于站點對 sys.path 的操作。 如果 site 會在稍后被顯式地導入也會禁用這些操作 (如果你希望觸發它們則應調用 site.main())。

-u?

強制 stdout 和 stderr 流不使用緩沖。 此選項對 stdin 流無影響。

另請參閱 PYTHONUNBUFFERED

在 3.7 版更改: stdout 和 stderr 流在文本層現在不使用緩沖。

-v?

每當一個模塊被初始化時打印一條信息,顯示其加載位置(文件名或內置模塊)。 當重復給出時 (-vv),為搜索模塊時所檢查的每個文件都打印一條消息。 此外還提供退出時有關模塊清理的信息A。 另請參閱 PYTHONVERBOSE

-W arg?

警告控制。 Python 的警告機制在默認情況下會向 sys.stderr 打印警告消息。 典型的警告消息具有如下形式:

file:line: category: message

默認情況下,每個警告都對于其發生所在的每個源行都會打印一次。 此選項可控制警告打印的頻繁程度。

可以給出多個 -W 選項;當某個警告能與多個選項匹配時,將執行最后一個匹配選項的操作。 無效的 -W 選項將被忽略(但是,在發出第一個警告時會打印有關無效選項的警告消息)。

警告也可以使用 PYTHONWARNINGS 環境變量以及使用 warnings 模塊在 Python 程序內部進行控制。

最簡單的設置是將某個特定操作無條件地應用于進程所發出所有警告 (即使是在默認情況下會忽略的那些警告):

-Wdefault  # Warn once per call location
-Werror    # Convert to exceptions
-Walways   # Warn every time
-Wmodule   # Warn once per calling module
-Wonce     # Warn once per Python process
-Wignore   # Never warn

操作名稱可以根據需要進行縮寫 (例如 -Wi, -Wd, -Wa, -We),解釋器將會把它們解析為適當的操作名稱。

請參閱 警告過濾器警告過濾器的介紹 了解更多細節。

-x?

跳過源中第一行,以允許使用非 Unix 形式的 #!cmd。 這適用于 DOS 專屬的破解操作。

-X?

保留用于各種具體實現專屬的選項。 CPython 目前定義了下列可用的值:

  • -X faulthandler 啟用 faulthandler

  • -X showrefcount 當程序結束或在交互解釋器中的每條語句之后輸出總引用計數和已使用內存塊計數。 此選項僅在調試版本中有效。

  • -X tracemalloc 使用 tracemalloc 模塊啟動對 Python 內存分配的跟蹤。 默認情況下,只有最近的幀會保存在跟蹤的回溯信息中。 使用 -X tracemalloc=NFRAME 以啟動限定回溯 NFRAME 幀的跟蹤。 請參閱 tracemalloc.start() 了解詳情。

  • -X showalloccount 當程序結束時輸出每種類型的已分配對象的總數。 此選項僅當 Python 在定義了 COUNT_ALLOCS 后構建時才會生效。

  • -X importtime 顯示每次導入耗費的時間。 它會顯示模塊名稱,累計時間(包括嵌套的導入)和自身時間(排除嵌套的導入)。 請注意它的輸出在多線程應用程序中可能會出錯。 典型用法如 python3 -X importtime -c 'import asyncio'。 另請參閱 PYTHONPROFILEIMPORTTIME

  • -X dev: 啟用 CPython 的“開發模式”,引入額外的運行時檢測,這些檢測因開銷過大而無法默認啟用。 如果代碼是正確的則它不會比默認輸出更詳細:新增警告只會在發現問題時才會發出。 開發模式的作用效果:

  • -X utf8 為操作系統接口啟用 UTF-8 模式,覆蓋默認的區域感知模式。 -X utf8=0 顯式地禁用 UTF-8 模式(即使在它應當被自動激活的時候)。 請參閱 PYTHONUTF8 了解詳情。

它還允許傳入任意值并通過 sys._xoptions 字典來提取這些值。

在 3.2 版更改: 增加了 -X 選項。

3.3 新版功能: -X faulthandler 選項。

3.4 新版功能: -X showrefcount-X tracemalloc 選項。

3.6 新版功能: -X showalloccount 選項。

3.7 新版功能: -X importtime, -X dev-X utf8 選項。

1.1.4. 不應當使用的選項?

-J?

保留給 Jython 使用。

1.2. 環境變量?

這些環境變量會影響 Python 的行為,它們是在命令行開關之前被處理的,但 -E 或 -I 除外。 根據約定,當存在沖突時命令行開關會覆蓋環境變量的設置。

PYTHONHOME?

更改標準 Python 庫的位置。 默認情況下庫是在 prefix/lib/pythonversionexec_prefix/lib/pythonversion 中搜索,其中 prefixexec_prefix 是由安裝位置確定的目錄,默認都位于 /usr/local

PYTHONHOME 被設為單個目錄時,它的值會同時替代 prefixexec_prefix。 要為兩者指定不同的值,請將 PYTHONHOME 設為 prefix:exec_prefix

PYTHONPATH?

增加模塊文件默認搜索路徑。 所用格式與終端的 PATH 相同:一個或多個由 os.pathsep 分隔的目錄路徑名稱(例如 Unix 上用冒號而在 Windows 上用分號)。 默認忽略不存在的目錄。

除了普通目錄之外,單個 PYTHONPATH 條目可以引用包含純Python模塊的zip文件(源代碼或編譯形式)。無法從zip文件導入擴展模塊。

默認索引路徑依賴于安裝路徑,但通常都是以 prefix/lib/pythonversion 開始 (參見上文中的 PYTHONHOME)。 它 總是 會被添加到 PYTHONPATH

有一個附加目錄將被插入到索引路徑的 PYTHONPATH 之前,正如上文中 接口選項 所描述的。 搜索路徑可以在 Python 程序內作為變量 sys.path 來進行操作。

PYTHONSTARTUP?

這如果是一個可讀文件的名稱,該文件中的 Python 命令會在交互模式的首個提示符顯示之前被執行。 該文件會在與交互式命令執行所在的同一命名空間中被執行,因此其中所定義或導入的對象可以在交互式會話中無限制地使用。 你還可以在這個文件中修改提示符 sys.ps1sys.ps2 以及鉤子 sys.__interactivehook__

PYTHONOPTIMIZE?

這如果被設為一個非空字符串,它就相當于指定 -O 選項。 如果設為一個整數,則它就相當于多次指定 -O

PYTHONBREAKPOINT?

此變量如果被設定,它會使用加點號的路徑標記一個可調用對象。 包含該可調用對象的模塊將被導入,隨后該可調用對象將由 sys.breakpointhook() 的默認實現來運行,后者自身將由內置的 breakpoint() 來調用。 如果未設定,或設定為空字符串,則它相當于值 "pdb.set_trace"。 將此變量設為字符串 "0" 會導致 sys.breakpointhook() 的默認實現不做任何事而直接返回。

3.7 新版功能.

PYTHONDEBUG?

此變量如果被設為一個非空字符串,它就相當于指定 -d 選項。 如果設為一個整數,則它就相當于多次指定 -d

PYTHONINSPECT?

此變量如果被設為一個非空字符串,它就相當于指定 -i 選項。

此變量也可由 Python 代碼使用 os.environ 來修改以在程序終結時強制檢查模式。

PYTHONUNBUFFERED?

此變量如果被設為一個非空字符串,它就相當于指定 -u 選項。

PYTHONVERBOSE?

此變量如果被設為一個非空字符串,它就相當于指定 -v 選項。 如果設為一個整數,則它就相當于多次指定 -v

PYTHONCASEOK?

如果設置此變量,Python 將忽略 import 語句中的大小寫。 這僅在 Windows 和 OS X 上有效。

PYTHONDONTWRITEBYTECODE?

此變量如果被設為一個非空字符串,Python 將不會嘗試在導入源模塊時寫入 .pyc 文件。 這相當于指定 -B 選項。

PYTHONHASHSEED?

如果此變量未設置或設為 random,將使用一個隨機值作為 str, bytes 和 datetime 對象哈希運算的種子。

如果 PYTHONHASHSEED 被設為一個整數值,它將被作為固定的種子數用來生成哈希隨機化所涵蓋的類型的 hash() 結果。

它的目的是允許可復現的哈希運算,例如用于解釋器本身的自我檢測,或允許一組 python 進程共享哈希值。

該整數必須為一個 [0,4294967295] 范圍內的十進制數。 指定數值 0 將禁用哈希隨機化。

3.2.3 新版功能.

PYTHONIOENCODING?

如果此變量在運行解釋器之前被設置,它會覆蓋通過 encodingname:errorhandler 語法設置的 stdin/stdout/stderr 所用編碼。 encodingname:errorhandler 部分都是可選項,與在 str.encode() 中的含義相同。

對于 stderr,:errorhandler 部分會被忽略;處理程序將總是為 'backslashreplace'

在 3.4 版更改: “encodingname” 部分現在是可選的。

在 3.6 版更改: 在 Windows 上,對于交互式控制臺緩沖區會忽略此變量所指定的編碼,除非還指定了 PYTHONLEGACYWINDOWSSTDIO。 通過標準流重定向的文件和管道則不受其影響。

PYTHONNOUSERSITE?

如果設置了此變量,Python 將不會把 用戶 site-packages 目錄 添加到 sys.path

參見

PEP 370 -- 分用戶的 site-packages 目錄

PYTHONUSERBASE?

定義 用戶基準目錄,它會在執行 python setup.py install --user 時被用來計算 用戶 site-packages 目錄 的路徑以及 Distutils 安裝路徑

參見

PEP 370 -- 分用戶的 site-packages 目錄

PYTHONEXECUTABLE?

如果設置了此環境變量,則 sys.argv[0] 將被設為此變量的值而不是通過 C 運行時所獲得的值。 僅在 Mac OS X 上起作用。

PYTHONWARNINGS?

此變量等價于 -W 選項。 如果被設為一個以逗號分隔的字符串,它就相當于多次指定 -W,列表中后出現的過濾器優先級會高于列表中先出現的。

最簡單的設置是將某個特定操作無條件地應用于進程所發出所有警告 (即使是在默認情況下會忽略的那些警告):

PYTHONWARNINGS=default  # Warn once per call location
PYTHONWARNINGS=error    # Convert to exceptions
PYTHONWARNINGS=always   # Warn every time
PYTHONWARNINGS=module   # Warn once per calling module
PYTHONWARNINGS=once     # Warn once per Python process
PYTHONWARNINGS=ignore   # Never warn

請參閱 警告過濾器警告過濾器的介紹 了解更多細節。

PYTHONFAULTHANDLER?

如果此環境變量被設為一個非空字符串,faulthandler.enable() 會在啟動時被調用:為 SIGSEGV, SIGFPE, SIGABRT, SIGBUSSIGILL 等信號安裝一個處理句柄以轉儲 Python 回溯信息。 此變量等價于 -X faulthandler 選項。

3.3 新版功能.

PYTHONTRACEMALLOC?

如果此環境變量被設為一個非空字符串,則會使用 tracemalloc 模塊啟動對 Python 內存分配的跟蹤。 該變量的值是保存于跟蹤的回溯信息中的最大幀數。 例如,PYTHONTRACEMALLOC=1 只保存最近的幀。 請參閱 tracemalloc.start() 了解詳情。

3.4 新版功能.

PYTHONPROFILEIMPORTTIME?

如果此變量被設為一個非空字符串,Python 將顯示每次導入花費了多長時間。 此變量完全等價于在命令行為設置 -X importtime

3.7 新版功能.

PYTHONASYNCIODEBUG?

如果此變量被設為一個非空字符串,則會啟用 asyncio 模塊的 調試模式

3.4 新版功能.

PYTHONMALLOC?

設置 Python 內存分配器和/或安裝調試鉤子。

設置 Python 所使用的內存分配器族群:

安裝調試鉤子:

  • debug: 在 默認內存分配器 之上安裝調試鉤子。

  • malloc_debug: 與 malloc 相同但還會安裝調試鉤子。

  • pymalloc_debug: 與 pymalloc 相同但還會安裝調試鉤子。

請參閱 默認內存分配器 以及 PyMem_SetupDebugHooks() 函數(在 Python 內存分配器之上安裝調試鉤子)。

在 3.7 版更改: 增加了 "default" 分配器。

3.6 新版功能.

PYTHONMALLOCSTATS?

如果設為一個非空字符串,Python 將在每次創建新的 pymalloc 對象區域以及在關閉時打印 pymalloc 內存分配器 的統計信息。

如果 PYTHONMALLOC 環境變量被用來強制開啟 C 庫的 malloc() 分配器,或者如果 Python 的配置不支持 pymalloc,則此變量將被忽略。

在 3.6 版更改: 此變量現在也可以被用于在發布模式下編譯的 Python。 如果它被設置為一個空字符串則將沒有任何效果。

PYTHONLEGACYWINDOWSFSENCODING?

如果設為一個非空字符串,則默認的文件系統編碼和錯誤模式將分別恢復為它們在 3.6 版之前的值 'mbcs' 和 'replace'。 否則會使用新的默認值 'utf-8' 和 'surrogatepass'。

這也可以在運行時通過 sys._enablelegacywindowsfsencoding() 來啟用。

可用性: Windows。

3.6 新版功能: 有關更多詳細信息,請參閱 PEP 529

PYTHONLEGACYWINDOWSSTDIO?

如果設為一個非空字符串,則不使用新的控制臺讀取器和寫入器。 這意味著 Unicode 字符將根據活動控制臺的代碼頁進行編碼,而不是使用 utf-8。

如果標準流被重定向(到文件或管道)而不是指向控制臺緩沖區則該變量會被忽略。

可用性: Windows。

3.6 新版功能.

PYTHONCOERCECLOCALE?

如果值設為 0,將導致主 Python 命令行應用跳過將傳統的基于 ASCII 的 C 與 POSIX 區域設置強制轉換為更強大的基于 UTF-8 的替代方案。

如果此變量 未被 設置(或被設為 0 以外的值),則覆蓋環境變量的 LC_ALL 區域選項也不會被設置,并且報告給 LC_CTYPE 類別的當前區域選項或者為默認的 C 區域,或者為顯式指明的基于 ASCII 的 POSIX 區域,然后 Python CLI 將在加載解釋器運行時之前嘗試為 LC_CTYPE 類別按指定的順序配置下列區域選項:

  • C.UTF-8

  • C.utf8

  • UTF-8

如果成功設置了以上區域類別中的一個,則初始化 Python 運行時之前也將在當前進程環境中相應地設置 LC_CTYPE 環境變量。 這會確保除了解釋器本身和運行于同一進程中的其他可感知區域選項的組件 (例如 GNU readline 庫) 之外,還能在子進程 (無論這些進程是否在運行 Python 解釋器) 以及在查詢環境而非當前 C 區域的操作 (例如 Python 自己的 locale.getdefaultlocale()) 中看到更新的設置。

(顯式地或通過上述的隱式區域強制轉換) 配置其中一個區域選項將自動為 sys.stdinsys.stdout 啟用 surrogateescape 錯誤處理句柄 (sys.stderr 會繼續使用 backslashreplace 如同在任何其他區域選項中一樣)。 這種流處理行為可以按通常方式使用 PYTHONIOENCODING 來覆蓋。

出于調試目的,如果激活了區域強制轉換,或者如果當 Python 運行時被初始化時某個 應該 觸發強制轉換的區域選項仍處于激活狀態則設置 PYTHONCOERCECLOCALE=warn 將導致 Python 在 stderr 上發出警告消息。

還要注意,即使在區域轉換轉換被禁用,或者在其無法找到合適的目標區域時,默認 PYTHONUTF8 仍將在傳統的基于 ASCII 的區域中被激活。 必須同時禁用這兩項特性以強制解釋器使用 ASCII 而不是 UTF-8 作為系統接口。

可用性: *nix。

3.7 新版功能: 請參閱 PEP 538 了解詳情。

PYTHONDEVMODE?

如果此環境變量被設為一個非空字符串,則會啟用 CPython “開發模式”。 參見 -X dev 選項。

3.7 新版功能.

PYTHONUTF8?

如果設為 1,則會啟用解釋器的 UTF-8 模式,將 UTF-8 用作系統接口的文本編碼,無論當前區域選項如何設置。

這意味著:

作為低層級 API 發生改變的結果,其他高層級 API 也會表現出不同的默認行為:

  • 命令行參數,環境變量和文件名會使用 UTF-8 編碼來解碼為文本。

  • os.fsdecode()os.fsencode() 會使用 UTF-8 編碼。

  • open(), io.open()codecs.open() 默認會使用 UTF-8 編碼。 但是,它們默認仍將使用嚴格錯誤處理句柄,因此試圖在文本模式下打開二進制文件將可能引發異常,而不是生成無意義的數據。

請注意 UTF-8 模式下的標準流設置可以被 PYTHONIOENCODING 所覆蓋(在默認的區域感知模式下也同樣如此)。

如果設置為“0”,則解釋器以其默認的區域識別模式運行。

設置任何其他非空字符串會在解釋器初始化期間導致錯誤。

如果根本未設置此環境變量,則解釋器默認使用當前區域設置,除非 當前區域被標識為基于 ASCII 的舊式區域設置(如 PYTHONCOERCECLOCALE 所述),并且區域強制轉換被禁用或失敗。 在此類舊式區域設置中,解釋器將默認啟用 UTF-8 模式,除非顯式地指定不這樣做。

也可以使用 -X utf8 選項。

3.7 新版功能: 有關更多詳細信息,請參閱 PEP 540

1.2.1. 調試模式變量?

設置這些變量只會在Python的調試版本中產生影響,也就是說,如果Python配置了 --with-pydebug 構建選項。

PYTHONTHREADDEBUG?

如果設置,Python將打印線程調試信息。

PYTHONDUMPREFS?

如果設置,Python在關閉解釋器,及轉儲對象和引用計數后仍將保持活動。