1. 命令行與環(huán)境?

為獲取各種設(shè)置信息,CPython 解析器會(huì)掃描命令行與環(huán)境。

CPython implementation detail: 其他實(shí)現(xiàn)的命令行方案可能會(huì)有所不同。 詳見(jiàn) 其他實(shí)現(xiàn)。

1.1. 命令行?

調(diào)用 Python 時(shí),可以指定下列任意選項(xiàng):

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

最常見(jiàn)的用例是啟動(dòng)時(shí)執(zhí)行腳本:

python myscript.py

1.1.1. 接口選項(xiàng)?

解釋器接口類似于 UNIX shell,但提供了額外的調(diào)用方法:

  • 用連接到 tty 設(shè)備的標(biāo)準(zhǔn)輸入調(diào)用時(shí),會(huì)提示輸入并執(zhí)行命令,輸入 EOF (文件結(jié)束符,UNIX 中按 Ctrl-D,Windows 中按 Ctrl-Z, Enter)時(shí)終止。

  • 用文件名參數(shù)或以標(biāo)準(zhǔn)輸入文件調(diào)用時(shí),讀取,并執(zhí)行該腳本文件。

  • 用目錄名參數(shù)調(diào)用時(shí),從該目錄讀取、執(zhí)行適當(dāng)名稱的腳本。

  • -c command 調(diào)用時(shí),執(zhí)行 command 表示的 Python 語(yǔ)句。command 可以包含用換行符分隔的多條語(yǔ)句。注意,前導(dǎo)空白字符在 Python 語(yǔ)句中非常重要!

  • -m module-name 調(diào)用時(shí),在 Python 模塊路徑中查找指定的模塊,并將其作為腳本執(zhí)行。

非交互模式下,先解析全部輸入,再執(zhí)行。

接口選項(xiàng)會(huì)終結(jié)解釋器讀入的選項(xiàng)列表,所有后續(xù)參數(shù)都在 sys.argv 里 -- 注意,首個(gè)元素,即下標(biāo)為零的元素(sys.argv[0])是表示程序來(lái)源的字符串。

-c <command>?

執(zhí)行 command 中的 Python 代碼。command 可以是一條語(yǔ)句,也可以是用換行符分隔的多條語(yǔ)句,其中,前導(dǎo)空白字符與普通模塊代碼中的作用一樣。

使用此選項(xiàng)時(shí),sys.argv 的首個(gè)元素為 "-c",并會(huì)把當(dāng)前目錄加入至 sys.path 開(kāi)頭(讓該目錄中的模塊作為頂層模塊導(dǎo)入)。

使用 command 參數(shù)會(huì)引發(fā) 審計(jì)事件 cpython.run_command 。

-m <module-name>?

sys.path 中搜索指定模塊,并以 __main__ 模塊執(zhí)行其內(nèi)容。

該參數(shù)是 模塊名,請(qǐng)勿輸入文件擴(kuò)展名(.py)。模塊名應(yīng)為有效的絕對(duì) Python 模塊名,但本實(shí)現(xiàn)對(duì)此不作強(qiáng)制要求(例如,允許使用含連字符 - 的名稱)。

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

備注

此選項(xiàng)不適用于內(nèi)置模塊和以 C 編寫(xiě)的擴(kuò)展模塊,因?yàn)樗鼈儾](méi)有對(duì)應(yīng)的 Python 模塊文件。 但是它仍然適用于預(yù)編譯的模塊,即使沒(méi)有可用的初始源文件。

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

-I 選項(xiàng)可用來(lái)在隔離模式下運(yùn)行腳本,此模式中 sys.path 既不包含當(dāng)前目錄也不包含用戶的 site-packages 目錄。 所有 PYTHON* 環(huán)境變量也會(huì)被忽略。

許多標(biāo)準(zhǔn)庫(kù)模塊都包含在執(zhí)行時(shí),以腳本方式調(diào)用的代碼。例如 timeit 模塊:

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

使用 module-name 參數(shù)會(huì)引發(fā) 審計(jì)事件 cpython.run_module 。

參見(jiàn)

runpy.run_module()

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

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

在 3.1 版更改: 提供包名稱來(lái)運(yùn)行 __main__ 子模塊。

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

-

從標(biāo)準(zhǔn)輸入 (sys.stdin) 讀取命令。標(biāo)準(zhǔn)輸入為終端時(shí),使用 -i。

使用此選項(xiàng)時(shí),sys.argv 的第一個(gè)元素是 "-", 同時(shí),把當(dāng)前目錄加入 sys.path 開(kāi)頭。

沒(méi)有參數(shù)時(shí),會(huì)觸發(fā) 審計(jì)事件 cpython.run_stdin 。

<script>

執(zhí)行 script 中的 Python 代碼,該參數(shù)應(yīng)為(絕對(duì)或相對(duì))文件系統(tǒng)路徑,指向 Python 文件、包含 __main__.py 文件的目錄,或包含 __main__.py 文件的 zip 文件。

給出此選項(xiàng)時(shí),sys.argv 的第一個(gè)元素就是在命令行中指定的腳本名稱。

如果腳本名稱直接指向 Python 文件,則把該文件所在目錄加入 sys.path 的開(kāi)頭,并且把該文件當(dāng)作 __main__ 模塊來(lái)執(zhí)行。

如果腳本名稱指向目錄或 zip 文件,則把腳本名加入 sys.path 的開(kāi)頭,并把該位置中的 __main__.py 文件當(dāng)作 __main__ 模塊來(lái)執(zhí)行。

-I 選項(xiàng)以隔離模式運(yùn)行腳本,此模式中,sys.path 既不包含腳本目錄,也不包含用戶的 site-packages 目錄,還會(huì)忽略所有 PYTHON* 環(huán)境變量。

使用 filename 參數(shù)會(huì)引發(fā) 審計(jì)事件 cpython.run_file 。

參見(jiàn)

runpy.run_path()

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

未給出接口選項(xiàng)時(shí),使用 -isys.argv[0] 為空字符串 (""),并把當(dāng)前目錄加至 sys.path 的開(kāi)頭。 此外,如果系統(tǒng)支持,還能自動(dòng)啟用 tab 補(bǔ)全和歷史編輯(參見(jiàn) Readline 配置)。

參見(jiàn)

調(diào)用解釋器

在 3.4 版更改: 自動(dòng)啟用 tab 補(bǔ)全和歷史編輯。

1.1.2. 通用選項(xiàng)?

-??
-h?
--help?

輸出所有命令行選項(xiàng)的簡(jiǎn)介。

-V?
--version?

輸出 Python 版本號(hào)并退出。示例如下:

Python 3.8.0b2+

輸入兩次 V 選項(xiàng)時(shí),輸出更多構(gòu)建信息,例如:

Python 3.8.0b2+ (3.8:0c076caaa8, Apr 20 2019, 21:55:00)
[GCC 6.2.0 20161005]

3.6 新版功能: -VV 選項(xiàng)。

1.1.3. 其他選項(xiàng)?

-b?

strbytesbytearray 對(duì)比, 或?qū)Ρ?bytesint 時(shí),會(huì)發(fā)出警告。重復(fù)給出該選項(xiàng)(-bb)時(shí)會(huì)報(bào)錯(cuò)。

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

-B?

給出此選項(xiàng)時(shí),Python 不在導(dǎo)入源模塊時(shí)寫(xiě)入 .pyc 文件。另請(qǐng)參閱 PYTHONDONTWRITEBYTECODE。

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

控制基于哈希值的 .pyc 文件的驗(yàn)證行為。 參見(jiàn) 已緩存字節(jié)碼的失效。 當(dāng)設(shè)為 default 時(shí),已選定和未選定的基于哈希值的字節(jié)碼緩存文件將根據(jù)其默認(rèn)語(yǔ)義進(jìn)行驗(yàn)證。 當(dāng)設(shè)為 always 時(shí),所有基于哈希值的 .pyc 文件,不論是已選定還是未選定的都將根據(jù)其對(duì)應(yīng)的源文件進(jìn)行驗(yàn)證。 當(dāng)設(shè)為 never 時(shí),基于哈希值的 .pyc 文件將不會(huì)根據(jù)其對(duì)應(yīng)的源文件進(jìn)行驗(yàn)證。

基于時(shí)間戳的 .pyc 文件的語(yǔ)義不會(huì)受此選項(xiàng)影響。

-d?

Turn on parser debugging output (for expert only). See also the PYTHONDEBUG environment variable.

This option requires a debug build of Python, otherwise it's ignored.

-E?

忽略所有 PYTHON* 環(huán)境變量,例如,已設(shè)置的 PYTHONPATHPYTHONHOME。

See also the -P and -I (isolated) options.

-i?

腳本是第一個(gè)參數(shù),或使用 -c 時(shí),即便 sys.stdin 不是終端,執(zhí)行腳本或命令后,也會(huì)進(jìn)入交互模式。不讀取 PYTHONSTARTUP 文件。

本選項(xiàng)用于,腳本觸發(fā)異常時(shí),檢查全局變量或堆?;厮?。 詳見(jiàn) PYTHONINSPECT

-I?

Run Python in isolated mode. This also implies -E, -P and -s options.

In isolated mode sys.path contains neither the script's directory nor the user's site-packages directory. All PYTHON* environment variables are ignored, too. Further restrictions may be imposed to prevent the user from injecting malicious code.

3.4 新版功能.

-O?

移除 assert 語(yǔ)句以及任何以 __debug__ 的值作為條件的代碼。 通過(guò)在 .pyc 擴(kuò)展名之前添加 .opt-1 來(lái)擴(kuò)充已編譯文件 (bytecode) 的文件名 (參見(jiàn) PEP 488)。 另請(qǐng)參閱 PYTHONOPTIMIZE

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

-OO?

在啟用 -O 的同時(shí)丟棄文檔字符串。 通過(guò)在 .pyc 擴(kuò)展名之前添加 .opt-2 來(lái)擴(kuò)展已編譯文件 (bytecode) 的文件名 (參見(jiàn) PEP 488)。

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

-P?

Don't prepend a potentially unsafe path to sys.path:

  • python -m module command line: Don't prepend the current working directory.

  • python script.py command line: Don't prepend the script's directory. If it's a symbolic link, resolve symbolic links.

  • python -c code and python (REPL) command lines: Don't prepend an empty string, which means the current working directory.

See also the PYTHONSAFEPATH environment variable, and -E and -I (isolated) options.

3.11 新版功能.

-q?

即使在交互模式下也不顯示版權(quán)和版本信息。

3.2 新版功能.

-R?

開(kāi)啟哈希隨機(jī)化。 此選項(xiàng)權(quán) PYTHONHASHSEED 環(huán)境變量設(shè)置為 0 時(shí)起作用,因?yàn)楣kS機(jī)化是默認(rèn)啟用的。

在Python的早期版本中,此選項(xiàng)啟用哈希隨機(jī)化,將 str 和 bytes 的對(duì)象 __hash__() 的值 "加鹽" 為不可預(yù)測(cè)的隨機(jī)值。雖然它們?cè)趩蝹€(gè)Python進(jìn)程中保持不變,但是在重復(fù)調(diào)用的Python進(jìn)程之間它們是不可預(yù)測(cè)的。

Hash randomization is intended to provide protection against a denial-of-service caused by carefully-chosen inputs that exploit the worst case performance of a dict construction, O(n2) complexity. See http://www.ocert.org/advisories/ocert-2011-003.html for details.

PYTHONHASHSEED 允許你為哈希種子密碼設(shè)置一個(gè)固定值。

在 3.7 版更改: 此選項(xiàng)不會(huì)再被忽略。

3.2.3 新版功能.

-s?

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

參見(jiàn)

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

-S?

禁用 site 的導(dǎo)入及其所附帶的基于站點(diǎn)對(duì) sys.path 的操作。 如果 site 會(huì)在稍后被顯式地導(dǎo)入也會(huì)禁用這些操作 (如果你希望觸發(fā)它們則應(yīng)調(diào)用 site.main())。

-u?

強(qiáng)制 stdout 和 stderr 流不使用緩沖。 此選項(xiàng)對(duì) stdin 流無(wú)影響。

另請(qǐng)參閱 PYTHONUNBUFFERED。

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

-v?

每次在初始化模塊時(shí)會(huì)打印一條信息,顯示被加載的地方(文件名或內(nèi)置模塊名)。當(dāng)給出兩個(gè)v( -vv )時(shí),搜索模塊時(shí)會(huì)為每個(gè)文件打印一條信息。退出時(shí)模塊清理的信息也會(huì)給出來(lái)。

在 3.10 版更改: site 模塊可以得到將要處理的站點(diǎn)路徑和 .pth 文件。

參閱 PYTHONVERBOSE 。

-W arg?

警告信息的控制。Python 的警告機(jī)制默認(rèn)將警告信息打印到 sys.stderr。

最簡(jiǎn)單的設(shè)置是將某個(gè)特定操作無(wú)條件地應(yīng)用于進(jìn)程所發(fā)出所有警告 (即使是在默認(rèn)情況下會(huì)忽略的那些警告):

-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

action 名可以根據(jù)需要進(jìn)行縮寫(xiě),解釋器將會(huì)解析為合適的名稱。例如,-Wi-Wignore 相同。

完整的參數(shù)如下:

action:message:category:module:lineno

空字段匹配所有值;尾部的空字段可以省略。例如,-W ignore::DeprecationWarning 將忽略所有的 DeprecationWarning 警告。

action 字段如上所述,但只適用于匹配其余字段的警告。

message 字段必須與整個(gè)警告信息相匹配;不區(qū)分大小寫(xiě)。

category 字段與警告類別相匹配(DeprecationWarning 等)。必須是個(gè)類名;檢測(cè)消息的實(shí)際警告類別是否為指定類別的子類。

module 字段匹配的是(完全限定)模塊名;區(qū)分大小寫(xiě)。

lineno 字段匹配行號(hào),其中 0 匹配所有行號(hào),相當(dāng)于省略了行號(hào)。

可以給出多個(gè) -W 選項(xiàng);當(dāng)某條警告信息匹配上多個(gè)選項(xiàng)時(shí),將執(zhí)行最后一個(gè)匹配項(xiàng)的操作。非法 -W 選項(xiàng)將被忽略(不過(guò),在觸發(fā)第一條警告時(shí),會(huì)打印出一條無(wú)效選項(xiàng)的警告信息)。

警告信息還可以用 PYTHONWARNINGS 環(huán)境變量來(lái)控制,也可以在 Python 程序中用 warnings 模塊進(jìn)行控制。例如, warnings.filterwarnings() 函數(shù)可對(duì)警告信息使用正則表達(dá)式。

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

-x?

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

-X?

保留用于各種具體實(shí)現(xiàn)專屬的選項(xiàng)。 CPython 目前定義了下列可用的值:

  • -X faulthandler 啟用 faulthandler;

  • -X showrefcount 可在程序結(jié)束時(shí)或在交互式解釋器每條語(yǔ)句后,輸出總的引用計(jì)數(shù)和使用的內(nèi)存塊數(shù)。這只適用于 調(diào)試版本。

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

  • -X importtime 顯示每次導(dǎo)入耗費(fèi)的時(shí)間。 它會(huì)顯示模塊名稱,累計(jì)時(shí)間(包括嵌套的導(dǎo)入)和自身時(shí)間(排除嵌套的導(dǎo)入)。 請(qǐng)注意它的輸出在多線程應(yīng)用程序中可能會(huì)出錯(cuò)。 典型用法如 python3 -X importtime -c 'import asyncio'。 另請(qǐng)參閱 PYTHONPROFILEIMPORTTIME

  • -X dev: 啟用 Python 開(kāi)發(fā)模式,引入在默認(rèn)情況下啟用會(huì)導(dǎo)致開(kāi)銷過(guò)大的運(yùn)行時(shí)檢查。

  • -X utf8 啟用 Python UTF-8 模式。 -X utf8=0 顯式禁用 Python UTF-8 模式 (即便已自動(dòng)啟用)。

  • -X pycache_prefix=PATH 允許將 .pyc 文件寫(xiě)入以給定目錄為根的并行樹(shù),而不是代碼樹(shù)。另見(jiàn) PYTHONPYCACHEPREFIX

  • -X warn_default_encoding issues a EncodingWarning when the locale-specific default encoding is used for opening files. See also PYTHONWARNDEFAULTENCODING.

  • -X no_debug_ranges disables the inclusion of the tables mapping extra location information (end line, start column offset and end column offset) to every instruction in code objects. This is useful when smaller code objects and pyc files are desired as well as suppressing the extra visual location indicators when the interpreter displays tracebacks. See also PYTHONNODEBUGRANGES.

  • -X frozen_modules determines whether or not frozen modules are ignored by the import machinery. A value of "on" means they get imported and "off" means they are ignored. The default is "on" if this is an installed Python (the normal case). If it's under development (running from the source tree) then the default is "off". Note that the "importlib_bootstrap" and "importlib_bootstrap_external" frozen modules are always used, even if this flag is set to "off".

它還允許傳入任意值并通過(guò) sys._xoptions 字典來(lái)提取這些值。

在 3.2 版更改: 增加了 -X 選項(xiàng)。

3.3 新版功能: -X faulthandler 選項(xiàng)。

3.4 新版功能: -X showrefcount-X tracemalloc 選項(xiàng)。

3.6 新版功能: -X showalloccount 選項(xiàng)。

3.7 新版功能: -X importtime, -X dev-X utf8 選項(xiàng)。

3.8 新版功能: -X pycache_prefix 選項(xiàng)。 -X dev 選項(xiàng)現(xiàn)在在 io.IOBase 析構(gòu)函數(shù)中記錄 close() 異常。

在 3.9 版更改: 使用 -X dev 選項(xiàng),在字符串編碼和解碼操作時(shí)檢查 encodingerrors 參數(shù)。

The -X showalloccount 選項(xiàng)已被移除。

3.10 新版功能: -X warn_default_encoding 選項(xiàng)。

Deprecated since version 3.9, removed in version 3.10: The -X oldparser option.

3.11 新版功能: The -X no_debug_ranges option.

3.11 新版功能: The -X frozen_modules option.

1.1.4. 不應(yīng)當(dāng)使用的選項(xiàng)?

-J?

保留給 Jython 使用。

1.2. 環(huán)境變量?

這些環(huán)境變量會(huì)影響 Python 的行為,它們是在命令行開(kāi)關(guān)之前被處理的,但 -E 或 -I 除外。 根據(jù)約定,當(dāng)存在沖突時(shí)命令行開(kāi)關(guān)會(huì)覆蓋環(huán)境變量的設(shè)置。

PYTHONHOME?

更改標(biāo)準(zhǔn) Python 庫(kù)的位置。 默認(rèn)情況下庫(kù)是在 prefix/lib/pythonversionexec_prefix/lib/pythonversion 中搜索,其中 prefixexec_prefix 是由安裝位置確定的目錄,默認(rèn)都位于 /usr/local。

當(dāng) PYTHONHOME 被設(shè)為單個(gè)目錄時(shí),它的值會(huì)同時(shí)替代 prefixexec_prefix。 要為兩者指定不同的值,請(qǐng)將 PYTHONHOME 設(shè)為 prefix:exec_prefix。

PYTHONPATH?

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

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

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

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

PYTHONSAFEPATH?

If this is set to a non-empty string, don't prepend a potentially unsafe path to sys.path: see the -P option for details.

3.11 新版功能.

PYTHONPLATLIBDIR?

如果它被設(shè)為非空字符串,則會(huì)覆蓋 sys.platlibdir 值。

3.9 新版功能.

PYTHONSTARTUP?

這如果是一個(gè)可讀文件的名稱,該文件中的 Python 命令會(huì)在交互模式的首個(gè)提示符顯示之前被執(zhí)行。 該文件會(huì)在與交互式命令執(zhí)行所在的同一命名空間中被執(zhí)行,因此其中所定義或?qū)氲膶?duì)象可以在交互式會(huì)話中無(wú)限制地使用。 你還可以在這個(gè)文件中修改提示符 sys.ps1sys.ps2 以及鉤子 sys.__interactivehook__。

使用 filename 參數(shù)會(huì)引發(fā) 審計(jì)事件 cpython.run_startup

PYTHONOPTIMIZE?

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

PYTHONBREAKPOINT?

此變量如果被設(shè)定,它會(huì)使用加點(diǎn)號(hào)的路徑標(biāo)記一個(gè)可調(diào)用對(duì)象。 包含該可調(diào)用對(duì)象的模塊將被導(dǎo)入,隨后該可調(diào)用對(duì)象將由 sys.breakpointhook() 的默認(rèn)實(shí)現(xiàn)來(lái)運(yùn)行,后者自身將由內(nèi)置的 breakpoint() 來(lái)調(diào)用。 如果未設(shè)定,或設(shè)定為空字符串,則它相當(dāng)于值 "pdb.set_trace"。 將此變量設(shè)為字符串 "0" 會(huì)導(dǎo)致 sys.breakpointhook() 的默認(rèn)實(shí)現(xiàn)不做任何事而直接返回。

3.7 新版功能.

PYTHONDEBUG?

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

This environment variable requires a debug build of Python, otherwise it's ignored.

PYTHONINSPECT?

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

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

PYTHONUNBUFFERED?

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

PYTHONVERBOSE?

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

PYTHONCASEOK?

If this is set, Python ignores case in import statements. This only works on Windows and macOS.

PYTHONDONTWRITEBYTECODE?

此變量如果被設(shè)為一個(gè)非空字符串,Python 將不會(huì)嘗試在導(dǎo)入源模塊時(shí)寫(xiě)入 .pyc 文件。 這相當(dāng)于指定 -B 選項(xiàng)。

PYTHONPYCACHEPREFIX?

如果設(shè)置了此選項(xiàng),Python將在鏡像目錄樹(shù)中的此路徑中寫(xiě)入 .pyc 文件,而不是源樹(shù)中的 __pycache__ 目錄中。這相當(dāng)于指定 -X pycache_prefix=PATH 選項(xiàng)。

3.8 新版功能.

PYTHONHASHSEED?

如果此變量未設(shè)置或設(shè)為 random,將使用一個(gè)隨機(jī)值作為 str 和 bytes 對(duì)象哈希運(yùn)算的種子。

如果 PYTHONHASHSEED 被設(shè)為一個(gè)整數(shù)值,它將被作為固定的種子數(shù)用來(lái)生成哈希隨機(jī)化所涵蓋的類型的 hash() 結(jié)果。

它的目的是允許可復(fù)現(xiàn)的哈希運(yùn)算,例如用于解釋器本身的自我檢測(cè),或允許一組 python 進(jìn)程共享哈希值。

該整數(shù)必須為一個(gè) [0,4294967295] 范圍內(nèi)的十進(jìn)制數(shù)。 指定數(shù)值 0 將禁用哈希隨機(jī)化。

3.2.3 新版功能.

PYTHONIOENCODING?

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

對(duì)于 stderr,:errorhandler 部分會(huì)被忽略;處理程序?qū)⒖偸菫?'backslashreplace'。

在 3.4 版更改: “encodingname” 部分現(xiàn)在是可選的。

在 3.6 版更改: 在 Windows 上,對(duì)于交互式控制臺(tái)緩沖區(qū)會(huì)忽略此變量所指定的編碼,除非還指定了 PYTHONLEGACYWINDOWSSTDIO。 通過(guò)標(biāo)準(zhǔn)流重定向的文件和管道則不受其影響。

PYTHONNOUSERSITE?

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

參見(jiàn)

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

PYTHONUSERBASE?

定義 用戶基準(zhǔn)目錄,它會(huì)在執(zhí)行 python setup.py install --user 時(shí)被用來(lái)計(jì)算 用戶 site-packages 目錄 的路徑以及 Distutils 安裝路徑

參見(jiàn)

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

PYTHONEXECUTABLE?

If this environment variable is set, sys.argv[0] will be set to its value instead of the value got through the C runtime. Only works on macOS.

PYTHONWARNINGS?

此變量等價(jià)于 -W 選項(xiàng)。 如果被設(shè)為一個(gè)以逗號(hào)分隔的字符串,它就相當(dāng)于多次指定 -W,列表中后出現(xiàn)的過(guò)濾器優(yōu)先級(jí)會(huì)高于列表中先出現(xiàn)的。

最簡(jiǎn)單的設(shè)置是將某個(gè)特定操作無(wú)條件地應(yīng)用于進(jìn)程所發(fā)出所有警告 (即使是在默認(rèn)情況下會(huì)忽略的那些警告):

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

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

PYTHONFAULTHANDLER?

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

3.3 新版功能.

PYTHONTRACEMALLOC?

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

3.4 新版功能.

PYTHONPROFILEIMPORTTIME?

如果此變量被設(shè)為一個(gè)非空字符串,Python 將顯示每次導(dǎo)入花費(fèi)了多長(zhǎng)時(shí)間。 此變量完全等價(jià)于在命令行為設(shè)置 -X importtime。

3.7 新版功能.

PYTHONASYNCIODEBUG?

如果此變量被設(shè)為一個(gè)非空字符串,則會(huì)啟用 asyncio 模塊的 調(diào)試模式

3.4 新版功能.

PYTHONMALLOC?

設(shè)置 Python 內(nèi)存分配器和/或安裝調(diào)試鉤子。

設(shè)置 Python 所使用的內(nèi)存分配器族群:

  • default: 使用 默認(rèn)內(nèi)存分配器

  • malloc: 對(duì)所有域 (PYMEM_DOMAIN_RAW, PYMEM_DOMAIN_MEM, PYMEM_DOMAIN_OBJ) 使用 C 庫(kù)的 malloc() 函數(shù)。

  • pymalloc: 對(duì) PYMEM_DOMAIN_MEMPYMEM_DOMAIN_OBJ 域使用 pymalloc 分配器 而對(duì) PYMEM_DOMAIN_RAW 域使用 malloc() 函數(shù)。

安裝 調(diào)試鉤子

  • debug: 在 默認(rèn)內(nèi)存分配器 之上安裝調(diào)試鉤子。

  • malloc_debug: 與 malloc 相同但還會(huì)安裝調(diào)試鉤子。

  • pymalloc_debug: 與 pymalloc 相同但還會(huì)安裝調(diào)試鉤子。

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

3.6 新版功能.

PYTHONMALLOCSTATS?

如果設(shè)為一個(gè)非空字符串,Python 將在每次創(chuàng)建新的 pymalloc 對(duì)象區(qū)域以及在關(guān)閉時(shí)打印 pymalloc 內(nèi)存分配器 的統(tǒng)計(jì)信息。

如果 PYTHONMALLOC 環(huán)境變量被用來(lái)強(qiáng)制開(kāi)啟 C 庫(kù)的 malloc() 分配器,或者如果 Python 的配置不支持 pymalloc,則此變量將被忽略。

在 3.6 版更改: 此變量現(xiàn)在也可以被用于在發(fā)布模式下編譯的 Python。 如果它被設(shè)置為一個(gè)空字符串則將沒(méi)有任何效果。

PYTHONLEGACYWINDOWSFSENCODING?

如果設(shè)為非空字符串,默認(rèn)的 filesystem encoding and error handler 模式將恢復(fù)到 3.6 版本之前的值 “mbcs”和“replace”。 否則,將采用新的默認(rèn)值“utf-8”和“surrogatepass”。

這也可以在運(yùn)行時(shí)通過(guò) sys._enablelegacywindowsfsencoding() 來(lái)啟用。

可用性: Windows。

3.6 新版功能: 更多詳情請(qǐng)參閱 PEP 529。

PYTHONLEGACYWINDOWSSTDIO?

如果設(shè)為一個(gè)非空字符串,則不使用新的控制臺(tái)讀取器和寫(xiě)入器。 這意味著 Unicode 字符將根據(jù)活動(dòng)控制臺(tái)的代碼頁(yè)進(jìn)行編碼,而不是使用 utf-8。

如果標(biāo)準(zhǔn)流被重定向(到文件或管道)而不是指向控制臺(tái)緩沖區(qū)則該變量會(huì)被忽略。

可用性: Windows。

3.6 新版功能.

PYTHONCOERCECLOCALE?

如果值設(shè)為 0,將導(dǎo)致主 Python 命令行應(yīng)用跳過(guò)將傳統(tǒng)的基于 ASCII 的 C 與 POSIX 區(qū)域設(shè)置強(qiáng)制轉(zhuǎn)換為更強(qiáng)大的基于 UTF-8 的替代方案。

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

  • C.UTF-8

  • C.utf8

  • UTF-8

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

(顯式地或通過(guò)上述的隱式區(qū)域強(qiáng)制轉(zhuǎn)換) 配置其中一個(gè)區(qū)域選項(xiàng)將自動(dòng)為 sys.stdinsys.stdout 啟用 surrogateescape 錯(cuò)誤處理句柄 (sys.stderr 會(huì)繼續(xù)使用 backslashreplace 如同在任何其他區(qū)域選項(xiàng)中一樣)。 這種流處理行為可以按通常方式使用 PYTHONIOENCODING 來(lái)覆蓋。

出于調(diào)試目的,如果激活了區(qū)域強(qiáng)制轉(zhuǎn)換,或者如果當(dāng) Python 運(yùn)行時(shí)被初始化時(shí)某個(gè) 應(yīng)該 觸發(fā)強(qiáng)制轉(zhuǎn)換的區(qū)域選項(xiàng)仍處于激活狀態(tài)則設(shè)置 PYTHONCOERCECLOCALE=warn 將導(dǎo)致 Python 在 stderr 上發(fā)出警告消息。

還要注意,即使在區(qū)域轉(zhuǎn)換轉(zhuǎn)換被禁用,或者在其無(wú)法找到合適的目標(biāo)區(qū)域時(shí),默認(rèn) PYTHONUTF8 仍將在傳統(tǒng)的基于 ASCII 的區(qū)域中被激活。 必須同時(shí)禁用這兩項(xiàng)特性以強(qiáng)制解釋器使用 ASCII 而不是 UTF-8 作為系統(tǒng)接口。

可用性: *nix。

3.7 新版功能: 請(qǐng)參閱 PEP 538 了解詳情。

PYTHONDEVMODE?

如果將此環(huán)境變量設(shè)為非空字符串,則啟用 Python 開(kāi)發(fā)模式,引入在默認(rèn)情況下啟用會(huì)導(dǎo)致開(kāi)銷過(guò)大的運(yùn)行時(shí)檢查。

3.7 新版功能.

PYTHONUTF8?

如果設(shè)為 1 ,將會(huì)啟用 Python UTF-8 模式。

若設(shè)為 0 ,則會(huì)禁用 Python UTF-8 模式 。

設(shè)置任何其他非空字符串會(huì)在解釋器初始化期間導(dǎo)致錯(cuò)誤。

3.7 新版功能.

PYTHONWARNDEFAULTENCODING?

如果該環(huán)境變量設(shè)為一個(gè)非空字符串,則在采用某地區(qū)默認(rèn)編碼時(shí),將會(huì)引發(fā)一條 EncodingWarning

請(qǐng)參閱 選擇性的 EncodingWarning 來(lái)了解詳情。

3.10 新版功能.

PYTHONNODEBUGRANGES?

If this variable is set, it disables the inclusion of the tables mapping extra location information (end line, start column offset and end column offset) to every instruction in code objects. This is useful when smaller code objects and pyc files are desired as well as suppressing the extra visual location indicators when the interpreter displays tracebacks.

3.11 新版功能.

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

PYTHONDUMPREFS?

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

需用 --with-trace-refs 編譯選項(xiàng)來(lái)配置 Python。

PYTHONDUMPREFSFILE=FILENAME?

If set, Python will dump objects and reference counts still alive after shutting down the interpreter into a file called FILENAME.

需用 --with-trace-refs 編譯選項(xiàng)來(lái)配置 Python。

3.11 新版功能.