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

參見

runpy.run_module()

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

PEP 338 -- 將模塊作為腳本執(zhí)行

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

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

-

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

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

<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. 通用選項?

-??
-h?
--help?

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

-V?
--version?

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

Python 3.7.0b2+

如果重復(fù)給出,則打印有關(guān)構(gòu)建的更多信息,例如:

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 比較時發(fā)出警告。 如果重復(fù)給出該選項 (-bb) 則會引發(fā)錯誤。

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

-B?

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

--check-hash-based-pycs default|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è)置的 PYTHONPATHPYTHONHOME。

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

-W arg?

警告控制。 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ì)節(jié)。

-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ā)模式的作用效果:

  • -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.1.4. 不應(yīng)當(dāng)使用的選項?

-J?

保留給 Jython 使用。

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/pythonversionexec_prefix/lib/pythonversion 中搜索,其中 prefixexec_prefix 是由安裝位置確定的目錄,默認(rèn)都位于 /usr/local

當(dāng) PYTHONHOME 被設(shè)為單個目錄時,它的值會同時替代 prefixexec_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.ps1sys.ps2 以及鉤子 sys.__interactivehook__。

PYTHONOPTIMIZE?

這如果被設(shè)為一個非空字符串,它就相當(dāng)于指定 -O 選項。 如果設(shè)為一個整數(shù),則它就相當(dāng)于多次指定 -O。

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 新版功能.

PYTHONDEBUG?

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

PYTHONINSPECT?

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

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

PYTHONUNBUFFERED?

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

PYTHONVERBOSE?

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

PYTHONCASEOK?

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

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

請參閱 警告過濾器警告過濾器的介紹 了解更多細(xì)節(jié)。

PYTHONFAULTHANDLER?

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

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)存分配器族群:

安裝調(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-8

  • C.utf8

  • UTF-8

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

(顯式地或通過上述的隱式區(qū)域強(qiáng)制轉(zhuǎn)換) 配置其中一個區(qū)域選項將自動為 sys.stdinsys.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 了解詳情。

PYTHONDEVMODE?

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

3.7 新版功能.

PYTHONUTF8?

如果設(shè)為 1,則會啟用解釋器的 UTF-8 模式,將 UTF-8 用作系統(tǒng)接口的文本編碼,無論當(dāng)前區(qū)域選項如何設(shè)置。

這意味著:

作為低層級 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 模式,除非顯式地指定不這樣做。

也可以使用 -X utf8 選項。

3.7 新版功能: 有關(guān)更多詳細(xì)信息,請參閱 PEP 540

1.2.1. 調(diào)試模式變量?

設(shè)置這些變量只會在Python的調(diào)試版本中產(chǎn)生影響,也就是說,如果Python配置了 --with-pydebug 構(gòu)建選項。

PYTHONTHREADDEBUG?

如果設(shè)置,Python將打印線程調(diào)試信息。

PYTHONDUMPREFS?

如果設(shè)置,Python在關(guān)閉解釋器,及轉(zhuǎn)儲對象和引用計數(shù)后仍將保持活動。