1. 命令行與環(huán)境?
CPython 解析器會掃描命令行與環(huán)境用于獲取各種設(shè)置信息。
CPython implementation detail: 其他實現(xiàn)的命令行方案可能有所不同。 更多相關(guān)資源請參閱 其他實現(xiàn)。
1.1. 命令行?
對 Python 發(fā)起調(diào)用時,你可以指定以下的任意選項:
python [-bBdEhiIOqsSuvVWx?] [-c command | -m module-name | script | - ] [args]
當(dāng)然最常見的用例就是簡單地啟動執(zhí)行一個腳本:
python myscript.py
1.1.1. 接口選項?
解釋器接口類似于 UNIX shell,但提供了一些額外的發(fā)起調(diào)用方法:
當(dāng)調(diào)用時附帶連接到某個 tty 設(shè)備的標(biāo)準(zhǔn)輸入時,它會提示輸入命令并執(zhí)行它們,直到讀入一個 EOF(文件結(jié)束字符,其產(chǎn)生方式是在 UNIX 中按 Ctrl-D 或在 Windows 中按 Ctrl-Z, Enter。)
當(dāng)調(diào)用時附帶一個文件名參數(shù)或以一個文件作為標(biāo)準(zhǔn)輸入時,它會從該文件讀取并執(zhí)行腳本程序。
當(dāng)調(diào)用時附帶一個目錄名參數(shù)時,它會從該目錄讀取并執(zhí)行具有適當(dāng)名稱的腳本程序。
當(dāng)調(diào)用時附帶
-c command時,它會執(zhí)行 command 所給出的 Python 語句。 在這里 command 可以包含以換行符分隔的多條語句。 請注意前導(dǎo)空格在 Python 語句中是有重要作用的!當(dāng)調(diào)用時附帶
-m module-name時,會在 Python 模塊路徑中查找指定的模塊,并將其作為腳本程序執(zhí)行。
在非交互模式下,會對全部輸入先解析再執(zhí)行。
一個接口選項會終結(jié)解釋器所讀入的選項列表,后續(xù)的所有參數(shù)將被放入 sys.argv -- 請注意其中首個元素即第零項 (sys.argv[0]) 會是一個表示程序源的字符串。
-
-c<command>? 執(zhí)行 command 中的 Python 代碼。 command 可以為一條或以換行符分隔的多條語句,其中前導(dǎo)空格像在普通模塊代碼中一樣具有作用。
如果給出此選項,
sys.argv的首個元素將為"-c"并且當(dāng)前目錄將被加入sys.path的開頭(以允許該目錄中的模塊作為最高層級模塊被導(dǎo)入)。
-
-m<module-name>? 在
sys.path中搜索指定名稱的模塊并將其內(nèi)容作為__main__模塊來執(zhí)行。由于該參數(shù)為 module 名稱,你不應(yīng)給出文件擴(kuò)展名 (
.py)。 模塊名稱應(yīng)為絕對有效的 Python 模塊名稱,但具體實現(xiàn)可能并不總是強(qiáng)制要求這一點(例如它可能允許你使用包含連字符的名稱)。包名稱(包括命名空間包)也允許使用。 當(dāng)所提供的是包名稱而非普通模塊名稱時,解釋器將把
<pkg>.__main__作為主模塊來執(zhí)行。 此行為特意被設(shè)計為與作為腳本參數(shù)傳遞給解釋器的目錄和 zip 文件的處理方式類似。注解
此選項不適用于內(nèi)置模塊和以 C 編寫的擴(kuò)展模塊,因為它們并沒有對應(yīng)的 Python 模塊文件。 但是它仍然適用于預(yù)編譯的模塊,即使沒有可用的初始源文件。
如果給出此選項,
sys.argv的首個元素將為模塊文件的完整路徑 (在定位模塊文件期間,首個元素將設(shè)為"-m")。 與-c選項一樣,當(dāng)前目錄將被加入sys.path的開頭。-I選項可用來在隔離模式下運行腳本,此模式中sys.path既不包含當(dāng)前目錄也不包含用戶的 site-packages 目錄。 所有PYTHON*環(huán)境變量也會被忽略。許多標(biāo)準(zhǔn)庫模塊都包含作為腳本執(zhí)行時會被發(fā)起調(diào)用的代碼。 其中的一個例子是
timeit模塊:python -m timeit -s 'setup here' 'benchmarked code here' python -m timeit -h # for details
在 3.1 版更改: 提供包名稱來運行
__main__子模塊。在 3.4 版更改: 同樣支持命名空間包
-
<script> 執(zhí)行 script 中的 Python 代碼,該參數(shù)應(yīng)為一個(絕對或相對)文件系統(tǒng)路徑,指向某個 Python 文件、包含
__main__.py文件的目錄,或包含__main__.py文件的 zip 文件。如果給出此選項,
sys.argv的首個元素將為在命令行中指定的腳本名稱。如果腳本名稱直接指向一個 Python 文件,則包含該文件的目錄將被加入
sys.path的開頭,并且該文件會被作為__main__模塊來執(zhí)行。如果腳本名稱指向一個目錄或 zip 文件,則腳本名稱將被加入
sys.path的開頭,并且該位置中的__main__.py文件會被作為__main__模塊來執(zhí)行。-I選項可用來在隔離模式下運行腳本,此模式中sys.path既不包含腳本所在目錄也不包含用戶的 site-packages 目錄。 所有PYTHON*環(huán)境變量也會被忽略。參見
runpy.run_path()Python 代碼可以直接使用的等效功能
如果沒有給出接口選項,則使用 -i,sys.argv[0] 將為空字符串 (""),并且當(dāng)前目錄會被加入 sys.path 的開頭。 此外,tab 補(bǔ)全和歷史編輯會自動啟用,如果你的系統(tǒng)平臺支持此功能的話 (參見 Readline(類庫) 配置)。
參見
在 3.4 版更改: 自動啟用 tab 補(bǔ)全和歷史編輯。
1.1.2. 通用選項?
1.1.3. 其他選項?
-
-B? 如果給出此選項,Python 將不會試圖在導(dǎo)入源模塊時寫入
.pyc文件。 另請參閱PYTHONDONTWRITEBYTECODE。
-
--check-hash-based-pycsdefault|always|never? 控制基于哈希值的
.pyc文件的驗證行為。 參見 已緩存字節(jié)碼的失效。 當(dāng)設(shè)為default時,已選定和未選定的基于哈希值的字節(jié)碼緩存文件將根據(jù)其默認(rèn)語義進(jìn)行驗證。 當(dāng)設(shè)為always時,所有基于哈希值的.pyc文件,不論是已選定還是未選定的都將根據(jù)其對應(yīng)的源文件進(jìn)行驗證。 當(dāng)設(shè)為never時,基于哈希值的.pyc文件將不會根據(jù)其對應(yīng)的源文件進(jìn)行驗證。基于時間戳的
.pyc文件的語義不會受此選項影響。
-
-d? 開啟解析器調(diào)試輸出(限專家使用,依賴于編譯選項)。 另請參閱
PYTHONDEBUG。
-
-E? 忽略所有
PYTHON*環(huán)境變量,例如可能已設(shè)置的PYTHONPATH和PYTHONHOME。
-
-i? 當(dāng)有腳本被作為首個參數(shù)傳入或使用了
-c選項時,在執(zhí)行腳本或命令之后進(jìn)入交互模式,即使是在sys.stdin并不是一個終端的時候。PYTHONSTARTUP文件不會被讀取。這一選項的用處是在腳本引發(fā)異常時檢查全局變量或者棧跟蹤。 另請參閱
PYTHONINSPECT。
-
-I? 在隔離模式下運行 Python。 這將同時應(yīng)用 -E 和 -s。 在隔離模式下
sys.path既不包含腳本所在目錄也不包含用戶的 site-packages 目錄。 所有PYTHON*環(huán)境變量也會被忽略。 還可以施加更進(jìn)一步的限制以防止用戶注入惡意代碼。3.4 新版功能.
-
-O? 移除 assert 語句以及任何以
__debug__的值作為條件的代碼。 通過在.pyc擴(kuò)展名之前添加.opt-1來擴(kuò)充已編譯文件 (bytecode) 的文件名 (參見 PEP 488)。 另請參閱PYTHONOPTIMIZE。在 3.5 版更改: 依據(jù) PEP 488 修改
.pyc文件名。
-
-OO? 在啟用
-O的同時丟棄文檔字符串。 通過在.pyc擴(kuò)展名之前添加.opt-2來擴(kuò)展已編譯文件 (bytecode) 的文件名 (參見 PEP 488)。在 3.5 版更改: 依據(jù) PEP 488 修改
.pyc文件名。
-
-q? 即使在交互模式下也不顯示版權(quán)和版本信息。
3.2 新版功能.
-
-R? 開啟哈希隨機(jī)化。 此選項權(quán)
PYTHONHASHSEED環(huán)境變量設(shè)置為0時起作用,因為哈希隨機(jī)化是默認(rèn)啟用的。在先前的 Python 版本中,此選項會開啟哈希隨機(jī)化,這樣 str, bytes 和 datetime 的
__hash__()值將會使用一個不可預(yù)測的隨機(jī)值來“加鹽”。 雖然它們在單個 Python 進(jìn)程中會保持不變,但在重復(fù)發(fā)起的 Python 調(diào)用之間則是不可預(yù)測的。哈希隨機(jī)化旨在針對由精心選擇的輸入引起的拒絕服務(wù)攻擊提供防護(hù),這種輸入利用了構(gòu)造 dict 在最壞情況下的性能即 O(n^2) 復(fù)雜度。 詳情請參閱 http://www.ocert.org/advisories/ocert-2011-003.html。
PYTHONHASHSEED允許你為哈希種子密碼設(shè)置一個固定值。在 3.7 版更改: 此選項不會再被忽略。
3.2.3 新版功能.
-
-s? 不要將
用戶 site-packages 目錄添加到sys.path。參見
PEP 370 -- 分用戶的 site-packages 目錄
-
-S? 禁用
site的導(dǎo)入及其所附帶的基于站點對sys.path的操作。 如果site會在稍后被顯式地導(dǎo)入也會禁用這些操作 (如果你希望觸發(fā)它們則應(yīng)調(diào)用site.main())。
-
-u? 強(qiáng)制 stdout 和 stderr 流不使用緩沖。 此選項對 stdin 流無影響。
另請參閱
PYTHONUNBUFFERED。在 3.7 版更改: stdout 和 stderr 流在文本層現(xiàn)在不使用緩沖。
-
-v? 每當(dāng)一個模塊被初始化時打印一條信息,顯示其加載位置(文件名或內(nèi)置模塊)。 當(dāng)重復(fù)給出時 (
-vv),為搜索模塊時所檢查的每個文件都打印一條消息。 此外還提供退出時有關(guān)模塊清理的信息A。 另請參閱PYTHONVERBOSE。
-
-Warg? 警告控制。 Python 的警告機(jī)制在默認(rèn)情況下會向
sys.stderr打印警告消息。 典型的警告消息具有如下形式:file:line: category: message
默認(rèn)情況下,每個警告都對于其發(fā)生所在的每個源行都會打印一次。 此選項可控制警告打印的頻繁程度。
可以給出多個
-W選項;當(dāng)某個警告能與多個選項匹配時,將執(zhí)行最后一個匹配選項的操作。 無效的-W選項將被忽略(但是,在發(fā)出第一個警告時會打印有關(guān)無效選項的警告消息)。警告也可以使用
PYTHONWARNINGS環(huán)境變量以及使用warnings模塊在 Python 程序內(nèi)部進(jìn)行控制。最簡單的設(shè)置是將某個特定操作無條件地應(yīng)用于進(jìn)程所發(fā)出所有警告 (即使是在默認(rèn)情況下會忽略的那些警告):
-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
操作名稱可以根據(jù)需要進(jìn)行縮寫 (例如
-Wi,-Wd,-Wa,-We),解釋器將會把它們解析為適當(dāng)?shù)牟僮髅Q。
-
-x? 跳過源中第一行,以允許使用非 Unix 形式的
#!cmd。 這適用于 DOS 專屬的破解操作。
-
-X? 保留用于各種具體實現(xiàn)專屬的選項。 CPython 目前定義了下列可用的值:
-X faulthandler啟用faulthandler;-X showrefcount當(dāng)程序結(jié)束或在交互解釋器中的每條語句之后輸出總引用計數(shù)和已使用內(nèi)存塊計數(shù)。 此選項僅在調(diào)試版本中有效。-X tracemalloc使用tracemalloc模塊啟動對 Python 內(nèi)存分配的跟蹤。 默認(rèn)情況下,只有最近的幀會保存在跟蹤的回溯信息中。 使用-X tracemalloc=NFRAME以啟動限定回溯 NFRAME 幀的跟蹤。 請參閱tracemalloc.start()了解詳情。-X showalloccount當(dāng)程序結(jié)束時輸出每種類型的已分配對象的總數(shù)。 此選項僅當(dāng) Python 在定義了COUNT_ALLOCS后構(gòu)建時才會生效。-X importtime顯示每次導(dǎo)入耗費的時間。 它會顯示模塊名稱,累計時間(包括嵌套的導(dǎo)入)和自身時間(排除嵌套的導(dǎo)入)。 請注意它的輸出在多線程應(yīng)用程序中可能會出錯。 典型用法如python3 -X importtime -c 'import asyncio'。 另請參閱PYTHONPROFILEIMPORTTIME。-X dev: 啟用 CPython 的“開發(fā)模式”,引入額外的運行時檢測,這些檢測因開銷過大而無法默認(rèn)啟用。 如果代碼是正確的則它不會比默認(rèn)輸出更詳細(xì):新增警告只會在發(fā)現(xiàn)問題時才會發(fā)出。 開發(fā)模式的作用效果:添加
default警告過濾器,即-Wdefault。在內(nèi)存分配器上安裝調(diào)試鉤子:參見
PyMem_SetupDebugHooks()C 函數(shù)。啟用
faulthandler模塊以在發(fā)生崩潰時轉(zhuǎn)儲 Python 回溯信息。將
sys.flags的dev_mode屬性設(shè)為True。
-X utf8為操作系統(tǒng)接口啟用 UTF-8 模式,覆蓋默認(rèn)的區(qū)域感知模式。-X utf8=0顯式地禁用 UTF-8 模式(即使在它應(yīng)當(dāng)被自動激活的時候)。 請參閱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.2. 環(huán)境變量?
這些環(huán)境變量會影響 Python 的行為,它們是在命令行開關(guān)之前被處理的,但 -E 或 -I 除外。 根據(jù)約定,當(dāng)存在沖突時命令行開關(guān)會覆蓋環(huán)境變量的設(shè)置。
-
PYTHONHOME? 更改標(biāo)準(zhǔn) Python 庫的位置。 默認(rèn)情況下庫是在
prefix/lib/pythonversion和exec_prefix/lib/pythonversion中搜索,其中prefix和exec_prefix是由安裝位置確定的目錄,默認(rèn)都位于/usr/local。當(dāng)
PYTHONHOME被設(shè)為單個目錄時,它的值會同時替代prefix和exec_prefix。 要為兩者指定不同的值,請將PYTHONHOME設(shè)為prefix:exec_prefix。
-
PYTHONPATH? 增加模塊文件默認(rèn)搜索路徑。 所用格式與終端的
PATH相同:一個或多個由os.pathsep分隔的目錄路徑名稱(例如 Unix 上用冒號而在 Windows 上用分號)。 默認(rèn)忽略不存在的目錄。除了普通目錄之外,單個
PYTHONPATH條目可以引用包含純Python模塊的zip文件(源代碼或編譯形式)。無法從zip文件導(dǎo)入擴(kuò)展模塊。默認(rèn)索引路徑依賴于安裝路徑,但通常都是以
prefix/lib/pythonversion開始 (參見上文中的PYTHONHOME)。 它 總是 會被添加到PYTHONPATH。有一個附加目錄將被插入到索引路徑的
PYTHONPATH之前,正如上文中 接口選項 所描述的。 搜索路徑可以在 Python 程序內(nèi)作為變量sys.path來進(jìn)行操作。
-
PYTHONSTARTUP? 這如果是一個可讀文件的名稱,該文件中的 Python 命令會在交互模式的首個提示符顯示之前被執(zhí)行。 該文件會在與交互式命令執(zhí)行所在的同一命名空間中被執(zhí)行,因此其中所定義或?qū)氲膶ο罂梢栽诮换ナ綍捴袩o限制地使用。 你還可以在這個文件中修改提示符
sys.ps1和sys.ps2以及鉤子sys.__interactivehook__。
-
PYTHONBREAKPOINT? 此變量如果被設(shè)定,它會使用加點號的路徑標(biāo)記一個可調(diào)用對象。 包含該可調(diào)用對象的模塊將被導(dǎo)入,隨后該可調(diào)用對象將由
sys.breakpointhook()的默認(rèn)實現(xiàn)來運行,后者自身將由內(nèi)置的breakpoint()來調(diào)用。 如果未設(shè)定,或設(shè)定為空字符串,則它相當(dāng)于值 "pdb.set_trace"。 將此變量設(shè)為字符串 "0" 會導(dǎo)致sys.breakpointhook()的默認(rèn)實現(xiàn)不做任何事而直接返回。3.7 新版功能.
-
PYTHONINSPECT? 此變量如果被設(shè)為一個非空字符串,它就相當(dāng)于指定
-i選項。此變量也可由 Python 代碼使用
os.environ來修改以在程序終結(jié)時強(qiáng)制檢查模式。
-
PYTHONDONTWRITEBYTECODE? 此變量如果被設(shè)為一個非空字符串,Python 將不會嘗試在導(dǎo)入源模塊時寫入
.pyc文件。 這相當(dāng)于指定-B選項。
-
PYTHONHASHSEED? 如果此變量未設(shè)置或設(shè)為
random,將使用一個隨機(jī)值作為 str, bytes 和 datetime 對象哈希運算的種子。如果
PYTHONHASHSEED被設(shè)為一個整數(shù)值,它將被作為固定的種子數(shù)用來生成哈希隨機(jī)化所涵蓋的類型的 hash() 結(jié)果。它的目的是允許可復(fù)現(xiàn)的哈希運算,例如用于解釋器本身的自我檢測,或允許一組 python 進(jìn)程共享哈希值。
該整數(shù)必須為一個 [0,4294967295] 范圍內(nèi)的十進(jìn)制數(shù)。 指定數(shù)值 0 將禁用哈希隨機(jī)化。
3.2.3 新版功能.
-
PYTHONIOENCODING? 如果此變量在運行解釋器之前被設(shè)置,它會覆蓋通過
encodingname:errorhandler語法設(shè)置的 stdin/stdout/stderr 所用編碼。encodingname和:errorhandler部分都是可選項,與在str.encode()中的含義相同。對于 stderr,
:errorhandler部分會被忽略;處理程序?qū)⒖偸菫?'backslashreplace'。在 3.4 版更改: “encodingname” 部分現(xiàn)在是可選的。
在 3.6 版更改: 在 Windows 上,對于交互式控制臺緩沖區(qū)會忽略此變量所指定的編碼,除非還指定了
PYTHONLEGACYWINDOWSSTDIO。 通過標(biāo)準(zhǔn)流重定向的文件和管道則不受其影響。
-
PYTHONNOUSERSITE? 如果設(shè)置了此變量,Python 將不會把
用戶 site-packages 目錄添加到sys.path。參見
PEP 370 -- 分用戶的 site-packages 目錄
-
PYTHONUSERBASE? 定義
用戶基準(zhǔn)目錄,它會在執(zhí)行python setup.py install --user時被用來計算用戶 site-packages 目錄的路徑以及 Distutils 安裝路徑。參見
PEP 370 -- 分用戶的 site-packages 目錄
-
PYTHONEXECUTABLE? 如果設(shè)置了此環(huán)境變量,則
sys.argv[0]將被設(shè)為此變量的值而不是通過 C 運行時所獲得的值。 僅在 Mac OS X 上起作用。
-
PYTHONWARNINGS? 此變量等價于
-W選項。 如果被設(shè)為一個以逗號分隔的字符串,它就相當(dāng)于多次指定-W,列表中后出現(xiàn)的過濾器優(yōu)先級會高于列表中先出現(xiàn)的。最簡單的設(shè)置是將某個特定操作無條件地應(yīng)用于進(jìn)程所發(fā)出所有警告 (即使是在默認(rèn)情況下會忽略的那些警告):
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? 如果此環(huán)境變量被設(shè)為一個非空字符串,
faulthandler.enable()會在啟動時被調(diào)用:為SIGSEGV,SIGFPE,SIGABRT,SIGBUS和SIGILL等信號安裝一個處理句柄以轉(zhuǎn)儲 Python 回溯信息。 此變量等價于-Xfaulthandler選項。3.3 新版功能.
-
PYTHONTRACEMALLOC? 如果此環(huán)境變量被設(shè)為一個非空字符串,則會使用
tracemalloc模塊啟動對 Python 內(nèi)存分配的跟蹤。 該變量的值是保存于跟蹤的回溯信息中的最大幀數(shù)。 例如,PYTHONTRACEMALLOC=1只保存最近的幀。 請參閱tracemalloc.start()了解詳情。3.4 新版功能.
-
PYTHONPROFILEIMPORTTIME? 如果此變量被設(shè)為一個非空字符串,Python 將顯示每次導(dǎo)入花費了多長時間。 此變量完全等價于在命令行為設(shè)置
-X importtime。3.7 新版功能.
-
PYTHONASYNCIODEBUG? 如果此變量被設(shè)為一個非空字符串,則會啟用
asyncio模塊的 調(diào)試模式。3.4 新版功能.
-
PYTHONMALLOC? 設(shè)置 Python 內(nèi)存分配器和/或安裝調(diào)試鉤子。
設(shè)置 Python 所使用的內(nèi)存分配器族群:
default: 使用 默認(rèn)內(nèi)存分配器。malloc: 對所有域 (PYMEM_DOMAIN_RAW,PYMEM_DOMAIN_MEM,PYMEM_DOMAIN_OBJ) 使用 C 庫的malloc()函數(shù)。pymalloc: 對PYMEM_DOMAIN_MEM和PYMEM_DOMAIN_OBJ域使用 pymalloc 分配器 而對PYMEM_DOMAIN_RAW域使用malloc()函數(shù)。
安裝調(diào)試鉤子:
debug: 在 默認(rèn)內(nèi)存分配器 之上安裝調(diào)試鉤子。malloc_debug: 與malloc相同但還會安裝調(diào)試鉤子。pymalloc_debug: 與pymalloc相同但還會安裝調(diào)試鉤子。
請參閱 默認(rèn)內(nèi)存分配器 以及
PyMem_SetupDebugHooks()函數(shù)(在 Python 內(nèi)存分配器之上安裝調(diào)試鉤子)。在 3.7 版更改: 增加了
"default"分配器。3.6 新版功能.
-
PYTHONMALLOCSTATS? 如果設(shè)為一個非空字符串,Python 將在每次創(chuàng)建新的 pymalloc 對象區(qū)域以及在關(guān)閉時打印 pymalloc 內(nèi)存分配器 的統(tǒng)計信息。
如果
PYTHONMALLOC環(huán)境變量被用來強(qiáng)制開啟 C 庫的malloc()分配器,或者如果 Python 的配置不支持pymalloc,則此變量將被忽略。在 3.6 版更改: 此變量現(xiàn)在也可以被用于在發(fā)布模式下編譯的 Python。 如果它被設(shè)置為一個空字符串則將沒有任何效果。
-
PYTHONLEGACYWINDOWSFSENCODING? 如果設(shè)為一個非空字符串,則默認(rèn)的文件系統(tǒng)編碼和錯誤模式將分別恢復(fù)為它們在 3.6 版之前的值 'mbcs' 和 'replace'。 否則會使用新的默認(rèn)值 'utf-8' 和 'surrogatepass'。
這也可以在運行時通過
sys._enablelegacywindowsfsencoding()來啟用。可用性: Windows。
3.6 新版功能: 有關(guān)更多詳細(xì)信息,請參閱 PEP 529。
-
PYTHONLEGACYWINDOWSSTDIO? 如果設(shè)為一個非空字符串,則不使用新的控制臺讀取器和寫入器。 這意味著 Unicode 字符將根據(jù)活動控制臺的代碼頁進(jìn)行編碼,而不是使用 utf-8。
如果標(biāo)準(zhǔn)流被重定向(到文件或管道)而不是指向控制臺緩沖區(qū)則該變量會被忽略。
可用性: Windows。
3.6 新版功能.
-
PYTHONCOERCECLOCALE? 如果值設(shè)為
0,將導(dǎo)致主 Python 命令行應(yīng)用跳過將傳統(tǒng)的基于 ASCII 的 C 與 POSIX 區(qū)域設(shè)置強(qiáng)制轉(zhuǎn)換為更強(qiáng)大的基于 UTF-8 的替代方案。如果此變量 未被 設(shè)置(或被設(shè)為
0以外的值),則覆蓋環(huán)境變量的LC_ALL區(qū)域選項也不會被設(shè)置,并且報告給LC_CTYPE類別的當(dāng)前區(qū)域選項或者為默認(rèn)的C區(qū)域,或者為顯式指明的基于 ASCII 的POSIX區(qū)域,然后 Python CLI 將在加載解釋器運行時之前嘗試為LC_CTYPE類別按指定的順序配置下列區(qū)域選項:C.UTF-8C.utf8UTF-8
如果成功設(shè)置了以上區(qū)域類別中的一個,則初始化 Python 運行時之前也將在當(dāng)前進(jìn)程環(huán)境中相應(yīng)地設(shè)置
LC_CTYPE環(huán)境變量。 這會確保除了解釋器本身和運行于同一進(jìn)程中的其他可感知區(qū)域選項的組件 (例如 GNUreadline庫) 之外,還能在子進(jìn)程 (無論這些進(jìn)程是否在運行 Python 解釋器) 以及在查詢環(huán)境而非當(dāng)前 C 區(qū)域的操作 (例如 Python 自己的locale.getdefaultlocale()) 中看到更新的設(shè)置。(顯式地或通過上述的隱式區(qū)域強(qiáng)制轉(zhuǎn)換) 配置其中一個區(qū)域選項將自動為
sys.stdin和sys.stdout啟用surrogateescape錯誤處理句柄 (sys.stderr會繼續(xù)使用backslashreplace如同在任何其他區(qū)域選項中一樣)。 這種流處理行為可以按通常方式使用PYTHONIOENCODING來覆蓋。出于調(diào)試目的,如果激活了區(qū)域強(qiáng)制轉(zhuǎn)換,或者如果當(dāng) Python 運行時被初始化時某個 應(yīng)該 觸發(fā)強(qiáng)制轉(zhuǎn)換的區(qū)域選項仍處于激活狀態(tài)則設(shè)置
PYTHONCOERCECLOCALE=warn將導(dǎo)致 Python 在stderr上發(fā)出警告消息。還要注意,即使在區(qū)域轉(zhuǎn)換轉(zhuǎn)換被禁用,或者在其無法找到合適的目標(biāo)區(qū)域時,默認(rèn)
PYTHONUTF8仍將在傳統(tǒng)的基于 ASCII 的區(qū)域中被激活。 必須同時禁用這兩項特性以強(qiáng)制解釋器使用ASCII而不是UTF-8作為系統(tǒng)接口。可用性: *nix。
3.7 新版功能: 請參閱 PEP 538 了解詳情。
-
PYTHONUTF8? 如果設(shè)為
1,則會啟用解釋器的 UTF-8 模式,將UTF-8用作系統(tǒng)接口的文本編碼,無論當(dāng)前區(qū)域選項如何設(shè)置。這意味著:
sys.getfilesystemencoding()將返回'UTF-8'(本地編碼會被忽略)。locale.getpreferredencoding()將返回'UTF-8'(本地編碼會被忽略,并且該函數(shù)的do_setlocale參數(shù)不起作用)。sys.stdin,sys.stdout和sys.stderr都將 UTF-8 用作它們的文本編碼,并且為sys.stdin和sys.stdout啟用surrogateescape錯誤處理句柄 (sys.stderr會繼續(xù)使用backslashreplace如同在默認(rèn)的局部感知模式下一樣)
作為低層級 API 發(fā)生改變的結(jié)果,其他高層級 API 也會表現(xiàn)出不同的默認(rèn)行為:
命令行參數(shù),環(huán)境變量和文件名會使用 UTF-8 編碼來解碼為文本。
os.fsdecode()和os.fsencode()會使用 UTF-8 編碼。open(),io.open()和codecs.open()默認(rèn)會使用 UTF-8 編碼。 但是,它們默認(rèn)仍將使用嚴(yán)格錯誤處理句柄,因此試圖在文本模式下打開二進(jìn)制文件將可能引發(fā)異常,而不是生成無意義的數(shù)據(jù)。
請注意 UTF-8 模式下的標(biāo)準(zhǔn)流設(shè)置可以被
PYTHONIOENCODING所覆蓋(在默認(rèn)的區(qū)域感知模式下也同樣如此)。如果設(shè)置為“0”,則解釋器以其默認(rèn)的區(qū)域識別模式運行。
設(shè)置任何其他非空字符串會在解釋器初始化期間導(dǎo)致錯誤。
如果根本未設(shè)置此環(huán)境變量,則解釋器默認(rèn)使用當(dāng)前區(qū)域設(shè)置,除非 當(dāng)前區(qū)域被標(biāo)識為基于 ASCII 的舊式區(qū)域設(shè)置(如
PYTHONCOERCECLOCALE所述),并且區(qū)域強(qiáng)制轉(zhuǎn)換被禁用或失敗。 在此類舊式區(qū)域設(shè)置中,解釋器將默認(rèn)啟用 UTF-8 模式,除非顯式地指定不這樣做。也可以使用
-Xutf8選項。3.7 新版功能: 有關(guān)更多詳細(xì)信息,請參閱 PEP 540 。
