4. 在Windows上使用 Python?

本文檔旨在概述在 Microsoft Windows 上使用 Python 時應(yīng)了解的特定于 Windows 的行為。

與大多數(shù)UNIX系統(tǒng)和服務(wù)不同,Windows系統(tǒng)沒有預(yù)安裝Python。多年來CPython 團(tuán)隊(duì)已經(jīng)編譯了每一個 發(fā)行版 的Windows安裝程序(MSI 包),已便Windows 用戶下載和安裝。這些安裝程序主要用于每個用戶單獨(dú)安裝Python時,添加核心解釋器和庫。安裝程序還可以為一臺機(jī)器的所有用戶安裝,并且可以為應(yīng)用程序本地分發(fā)提供單獨(dú)的zip文件。

PEP 11 所述,Python 發(fā)布版對某個 Windows 平臺的支持僅限于被 Microsoft 視為處于延長支持周期內(nèi)的版本。 這意味著 Python 3.12 支持 Windows 8.1 及其后的版本。 如果你需要 Windows 7 支持,請安裝 Python 3.8。

Windows提供了許多不同的安裝程序,每個安裝程序都有一定的優(yōu)點(diǎn)和缺點(diǎn)。

完整安裝程序 內(nèi)含所有組件,對于使用Python 進(jìn)行任何類型項(xiàng)目的開發(fā)人員而言,它是最佳選擇。

Microsoft Store包 是一個簡單的Python 安裝,適用于運(yùn)行腳本和包,以及使用IDLE或其他開發(fā)環(huán)境。 它需要Windows 10,但可以安全地安裝而不會破壞其他程序。 它還提供了許多方便的命令來啟動Python及其工具。

nuget.org 安裝包 是用于持續(xù)集成系統(tǒng)的輕量級安裝。它可用于構(gòu)建Python包或運(yùn)行腳本,但不可更新且沒有用戶界面工具。

可嵌入的包 是Python的最小安裝包,適合嵌入到更大的應(yīng)用程序中。

4.1. 完整安裝程序?

4.1.1. 安裝步驟?

四個 Python 3.12 安裝程序可供下載 - 32位和64位版本的各有兩個。 web installer (網(wǎng)絡(luò)安裝包)是一個小的初始化工具,它將在安裝過程中,根據(jù)需要自動下載所需的組件。 offline installer (離線安裝包)內(nèi)含默認(rèn)安裝所需的組件,可選擇功能仍需要Internet連接下載。請參閱 免下載安裝 以了解在安裝過程中避免下載的其他方法。

啟動安裝程序后,可以選擇以下兩個選項(xiàng)之一:

../images/win_installer.png

如果選擇“Install Now(立即安裝)”:

  • 需要成為管理員(除非需要對C運(yùn)行庫進(jìn)行系統(tǒng)更新,或者為所有用戶安裝 適用于Windows的Python啟動器

  • Python將安裝到您的用戶目錄中

  • 適用于Windows的Python啟動器 將根據(jù)第一頁底部的選項(xiàng)安裝

  • 將安裝標(biāo)準(zhǔn)庫,測試套件,啟動器和pip

  • 如果選擇將安裝目錄將添加到 PATH

  • 快捷方式僅對當(dāng)前用戶可見

選擇“自定義安裝”將允許您選擇:要安裝的功能、安裝位置、其他選項(xiàng)或安裝后的操作。如果要安裝調(diào)試符號或二進(jìn)制文件,您需要使用此選項(xiàng)。

如要為全部用戶安裝,應(yīng)選擇“自定義安裝”。在這種情況下:

  • 您可能需要提供管理憑據(jù)或批準(zhǔn)

  • Python 將安裝到Program Files目錄中

  • 適用于Windows的Python啟動器 將安裝到Windows目錄中

  • 安裝期間可以選擇可選功能

  • 標(biāo)準(zhǔn)庫可以預(yù)編譯為字節(jié)碼

  • 如果選中,安裝目錄將添加到系統(tǒng) PATH

  • 快捷方式所有用戶可用

4.1.2. 刪除 MAX_PATH 限制?

歷史上Windows的路徑長度限制為260個字符。這意味著長于此的路徑將無法解決并導(dǎo)致錯誤。

在最新版本的 Windows 中,此限制可被擴(kuò)展到大約 32,000 個字符。 但需要讓管理員激活“啟用 Win32 長路徑”組策略,或在注冊表鍵 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem 中設(shè)置 LongPathsEnabled1。

這允許 open() 函數(shù),os 模塊和大多數(shù)其他路徑功能接受并返回長度超過 260 個字符的路徑。

更改上述選項(xiàng)后,無需進(jìn)一步配置。

在 3.6 版更改: Python中啟用了對長路徑的支持。

4.1.3. 無UI 安裝?

安裝程序UI中的所有選項(xiàng)也可以從命令行指定,允許腳本安裝程序在許多機(jī)器上復(fù)制安裝,而無需用戶交互。還可以在不禁用UI的情況下設(shè)置這些選項(xiàng),以更改一些默認(rèn)值。

The following options (found by executing the installer with /?) can be passed into the installer:

名稱

描述

/passive

to display progress without requiring user interaction

/quiet

to install/uninstall without displaying any UI

/simple

to prevent user customization

/uninstall

to remove Python (without confirmation)

/layout [directory]

to pre-download all components

/log [filename]

to specify log files location

所有其他選項(xiàng)都傳遞為 name=value ,其中值通常是 0 來禁用某個特性, 1 來啟用某個特性或路徑。可用選項(xiàng)的完整列表如下所示。

名稱

描述

默認(rèn)值

InstallAllUsers

為所有用戶安裝。

0

TargetDir

安裝目錄

基于InstallAllUsers選擇

DefaultAllUsersTargetDir

為所有用戶安裝時的默認(rèn)安裝路徑

%ProgramFiles%\Python X.Y%ProgramFiles(x86)%\Python X.Y

DefaultJustForMeTargetDir

僅為當(dāng)前用戶安裝時的默認(rèn)安裝路徑

%LocalAppData%\Programs\PythonXY%LocalAppData%\Programs\PythonXY-32%LocalAppData%\Programs\PythonXY-64

DefaultCustomTargetDir

UI中顯示的默認(rèn)自定義安裝目錄

(空)

AssociateFiles

如果還安裝了啟動器,則創(chuàng)建文件關(guān)聯(lián)。

1

CompileAll

將所有 .py 文件編譯為 .pyc 。

0

PrependPath

Prepend install and Scripts directories to PATH and add .PY to PATHEXT

0

AppendPath

Append install and Scripts directories to PATH and add .PY to PATHEXT

0

Shortcuts

如果已安裝,為解釋器,文檔和IDLE創(chuàng)建快捷方式

1

Include_doc

安裝Python手冊

1

Include_debug

安裝調(diào)試二進(jìn)制文件

0

Include_dev

安裝開發(fā)人員頭文件和庫

1

Include_exe

安裝 python.exe 及相關(guān)文件

1

Include_launcher

安裝 適用于Windows的Python啟動器 .

1

InstallLauncherAllUsers

為所有用戶安裝 適用于Windows的Python啟動器

1

Include_lib

安裝標(biāo)準(zhǔn)庫和擴(kuò)展模塊

1

Include_pip

安裝捆綁的pip和setuptools

1

Include_symbols

安裝調(diào)試符號(*.pdb)

0

Include_tcltk

安裝Tcl/Tk 支持和IDLE

1

Include_test

安裝標(biāo)準(zhǔn)庫測試套件

1

Include_tools

安裝實(shí)用程序腳本

1

LauncherOnly

僅安裝啟動器。這將覆蓋大多數(shù)其他選項(xiàng)。

0

SimpleInstall

禁用大多數(shù)安裝UI

0

SimpleInstallDescription

使用簡化安裝UI時顯示的自定義消息。

(空)

例如,要以靜默方式全局安裝默認(rèn)的Python,您可以(在命令提示符>)使用以下命令:

python-3.9.0.exe /quiet InstallAllUsers=1 PrependPath=1 Include_test=0

要允許用戶在沒有測試套件的情況下輕松安裝Python的個人副本,可以使用以下命令提供快捷方式。這將顯示一個簡化的初始頁面,不允許自定義:

python-3.9.0.exe InstallAllUsers=0 Include_launcher=0 Include_test=0
    SimpleInstall=1 SimpleInstallDescription="Just for me, no test suite."

(請注意,省略啟動器也會省略文件關(guān)聯(lián),并且僅在全局安裝包含啟動器時才建議用于每用戶安裝。)

上面列出的選項(xiàng)也可以在一個名為 unattend.xml 的文件中與可執(zhí)行文件一起提供。此文件指定選項(xiàng)和值的列表。作為屬性提供的值,(如果可能)它將轉(zhuǎn)換為數(shù)字。作為文本提供的值,始終保留為字符串。此示例文件設(shè)置與上一示例采用相同的選項(xiàng):

<Options>
    <Option Name="InstallAllUsers" Value="no" />
    <Option Name="Include_launcher" Value="0" />
    <Option Name="Include_test" Value="no" />
    <Option Name="SimpleInstall" Value="yes" />
    <Option Name="SimpleInstallDescription">Just for me, no test suite</Option>
</Options>

4.1.4. 免下載安裝?

由于下載的初始安裝包中未包含Python的某些可選功能,如果選擇安裝這些功能可能需要Internet連接。為了避免這種需要,可以按需下載所有可能的組件,以創(chuàng)建一個完整的布局,該布局將不再需要internet連接,而不管所選擇的特性是什么。請注意,此下載可能比要求的要大,但是如果要執(zhí)行大量安裝,則擁有本地緩存??的副本非常有用。

從命令提示符執(zhí)行以下命令以下載所有可能的必需文件。 請記得要將 python-3.9.0.exe 替換為安裝程序的實(shí)際名稱,并在單獨(dú)的目錄中創(chuàng)建子目錄以避免同名文件間的沖突。

python-3.9.0.exe /layout [optional target directory]

您也可以指定 /quiet 選項(xiàng)來隱藏進(jìn)度顯示。

4.1.5. 修改安裝?

安裝Python后,您可以通過Windows中的“程序和功能”工具添加或刪除功能。選擇Python條目并選擇“卸載/更改”以在維護(hù)模式下打開安裝程序。

“修改” 允許您通過修改復(fù)選框來添加或刪除功能 - 未更改的復(fù)選框?qū)⒉粫惭b或刪除任何內(nèi)容。在此模式下無法更改某些選項(xiàng),例如安裝目錄;要修改這些,您需要完全刪除然后重新安裝Python。

“修復(fù)” 將使用當(dāng)前設(shè)置驗(yàn)證應(yīng)安裝的所有文件,并替換已刪除或修改的任何文件

“卸載” 將完全刪除Python,但 適用于Windows的Python啟動器 除外,它在“程序和功能”中有自己的條目。

4.2. Microsoft Store包?

3.7.2 新版功能.

Microsoft Store 包是一個易于安裝的 Python 解釋器,主要針對在交互模式下使用,例如用于教學(xué)。

要安裝此軟件包,請確保您擁有最新的Windows 10更新,并在Microsoft Store應(yīng)用程序中搜索 "Python 3.12" 。確保您選擇的應(yīng)用程序由 Python Software Foundation 發(fā)布并安裝。

警告

Python將始終在Microsoft Store上免費(fèi)提供。如果要求您付款,則表示您沒有選擇正確的包。

安裝完成后,可以在開始菜單中找到它來啟動 Python?;蛘呖梢栽诿钐崾痉?PowerShell 會話中輸入 python 來啟動。此外可以輸入 pipidle 來使用 pip 和 IDLE。IDLE 也在開始菜單中。

所有這三個命令也可以使用版本號后綴,例如, python3.exepython3.x.exe 以及 python.exe (其中 3.x 是您要啟動的特定版本,例如 3.12 )。在 設(shè)置-->主頁-->應(yīng)用和功能 頁面中,點(diǎn)選 管理可選功能 ,選擇與每個命令關(guān)聯(lián)的python版本。建議確保 pipidle 與選擇的 python 版本一致。

可以使用 python -m venv 創(chuàng)建虛擬環(huán)境并激活并正常使用。

如果你已經(jīng)安裝了另一個版本的Python并將它添加到你的 PATH 變量中,那么它將作為 python.exe 而不是來自Microsoft Store的那個。要訪問新安裝,請使用 python3.exepython3.x.exe 。

py.exe 啟動器將檢測此 Python 安裝版,但會優(yōu)先使用來自傳統(tǒng)安裝器的安裝版。

要刪除Python,請打開“設(shè)置”并使用“應(yīng)用程序和功能”,或者在“開始”中找到Python,然后右鍵單擊以選擇“卸載”。卸載將刪除該已安裝Python程序中的所有軟件包,但不會刪除任何虛擬環(huán)境

4.2.1. 已知的問題?

由于Microsoft Store應(yīng)用程序的限制,Python腳本可能無法對共享位置(如 TEMP )和注冊表進(jìn)行完全寫入訪問。相反,它將寫入私人副本。如果腳本必須修改共享位置,則需要安裝完整安裝程序。

有關(guān)此限制的技術(shù)原理的更多細(xì)節(jié),請查詢 Microsoft 已打包完全可信應(yīng)用的文檔,當(dāng)前位于 docs.microsoft.com/en-us/windows/msix/desktop/desktop-to-uwp-behind-the-scenes

4.3. nuget.org 安裝包?

3.5.2 新版功能.

nuget.org是一個精簡的Python環(huán)境,用于在沒有全局安裝Python的系統(tǒng)的持續(xù)集成和構(gòu)建。雖然Nuget是“.NET的包管理器”,但是對于包含構(gòu)建時工具的包來說,它也可以很好地工作。

訪問 nuget.org 獲取有關(guān)使用nuget的最新信息。下面的摘要對Python開發(fā)人員來說已經(jīng)足夠了。

 nuget.exe 命令行工具可以直接從 https://aka.ms/nugetclidl 下載,例如,使用curl或PowerShell。使用該工具安裝64位或32位最新版本的Python:

nuget.exe install python -ExcludeVersion -OutputDirectory .
nuget.exe install pythonx86 -ExcludeVersion -OutputDirectory .

To select a particular version, add a -Version 3.x.y. The output directory may be changed from ., and the package will be installed into a subdirectory. By default, the subdirectory is named the same as the package, and without the -ExcludeVersion option this name will include the specific version installed. Inside the subdirectory is a tools directory that contains the Python installation:

# Without -ExcludeVersion
> .\python.3.5.2\tools\python.exe -V
Python 3.5.2

# With -ExcludeVersion
> .\python\tools\python.exe -V
Python 3.5.2

通常,nuget包不可升級,應(yīng)該平行安裝較新版本并使用完整路徑引用?;蛘撸謩觿h除程序包目錄并再次安裝。如果在構(gòu)建之間不保留文件,許多CI系統(tǒng)將自動執(zhí)行此操作。

除了 tools 目錄外,還有一個 build\native 目錄。它包含一個MSBuild屬性文件 python.props ,可以在C++項(xiàng)目中使用該文件來引用Python安裝。包含這些設(shè)置將自動在生成中使用標(biāo)頭和導(dǎo)入庫。

nuget.org上的包信息頁是 www.nuget.org/packages/python 對于64位版本和 www.nuget.org/packages/pythonx86 表示32位版本。

4.4. 可嵌入的包?

3.5 新版功能.

嵌入式發(fā)行版是一個包含最小Python環(huán)境的ZIP文件。它旨在作為另一個應(yīng)用程序的一部分,而不是由最終用戶直接訪問。

解壓縮后,嵌入式發(fā)行版(幾乎)與用戶系統(tǒng)完全隔離,包括環(huán)境變量、系統(tǒng)注冊表設(shè)置和已安裝的軟件包。標(biāo)準(zhǔn)庫作為預(yù)先編譯和優(yōu)化的 .pyc 文件包含在ZIP中,并提供了 python3.dllpython37.dll , python.exepythonw.exe 文件。不包括Tcl/tk(包括所有依賴項(xiàng),如Idle),pip和Python文檔。

備注

The embedded distribution does not include the Microsoft C Runtime and it is the responsibility of the application installer to provide this. The runtime may have already been installed on a user's system previously or automatically via Windows Update, and can be detected by finding ucrtbase.dll in the system directory.

第三方軟件包應(yīng)該由應(yīng)用程序與嵌入式發(fā)行版一起安裝。這個發(fā)行版不支持像常規(guī)Python安裝那樣使用pip來管理依賴關(guān)系,不過可以小心地將pip包含進(jìn)來并使用它進(jìn)行自動更新。通常,第三方包應(yīng)該作為應(yīng)用程序的一部分(“打包”)處理,以便開發(fā)人員在向用戶提供更新之前能夠確保與新版本兼容。

下面描述了這個發(fā)行版的兩個推薦用例。

4.4.1. Python應(yīng)用程序?

用Python編寫的應(yīng)用程序并不一定要求用戶了解這一事實(shí)。在這種情況下,可以使用嵌入式發(fā)行版在安裝包中包含Python的私有版本。根據(jù)它應(yīng)該有多透明(或者相反,它應(yīng)該看起來有多專業(yè)),有兩個選項(xiàng)。

使用專門的可執(zhí)行文件作為啟動程序需要一些編碼,但為用戶提供了最透明的體驗(yàn)。使用定制的啟動器,沒有明顯的跡象表明程序是在Python上運(yùn)行的:圖標(biāo)可以定制,公司和版本信息可以指定,文件關(guān)聯(lián)可以正常運(yùn)行。在大多數(shù)情況下,自定義啟動程序應(yīng)該只需使用硬編碼的命令行就能調(diào)用 Py_Main

更簡單的方法是提供批處理文件或生成的快捷方式,使用所需的命令行參數(shù)直接調(diào)用 python.exepythonw.exe 。在這種情況下,應(yīng)用程序?qū)@示為Python而不是其實(shí)際名稱,并且用戶可能無法將其與其他正在運(yùn)行的Python進(jìn)程或文件關(guān)聯(lián)區(qū)分開來。

對于后一種方法,包應(yīng)該與Python可執(zhí)行文件一起作為目錄安裝,以確保它們在路徑上可用。使用專用的啟動器,包可以位于其他位置,因?yàn)樵趩討?yīng)用程序之前有機(jī)會指定搜索路徑。

4.4.2. 嵌入Python?

用本地代碼編寫的應(yīng)用程序通常需要某種形式的腳本語言,嵌入式Python發(fā)行版可以用于此目的。通常,應(yīng)用程序的大部分都是本機(jī)代碼,某些部分將調(diào)用 python.exe 或直接使用 python3.dll 。無論是哪種情況,將嵌入的發(fā)行版解壓縮到應(yīng)用程序安裝的子目錄中就足以提供可加載的Python解釋器。

與應(yīng)用程序使用一樣,包可以安裝到任何位置,因?yàn)樵诔跏蓟忉屍髦坝袡C(jī)會指定搜索路徑。否則,使用嵌入式發(fā)行版和常規(guī)安裝之間沒有根本區(qū)別。

4.5. 替代捆綁包?

除了標(biāo)準(zhǔn)的CPython發(fā)行版之外,還有一些包含附加功能的修改包。以下是熱門版本及其主要功能的列表:

ActivePython

具有多平臺兼容性的安裝程序,文檔,PyWin32

Anaconda

流行的科學(xué)模塊(如numpy,scipy和pandas)和 conda 包管理器。

Canopy

具有編輯器和其他開發(fā)工具的“全面的Python分析環(huán)境”。

WinPython

特定于Windows的發(fā)行版,包含用于構(gòu)建包的預(yù)構(gòu)建科學(xué)包和工具。

請注意,這些軟件包可能不包含最新版本的Python或其他庫,并且不由核心Python團(tuán)隊(duì)維護(hù)或支持。

4.6. 配置Python?

要從命令提示符方便地運(yùn)行Python,您可以考慮在Windows中更改一些默認(rèn)環(huán)境變量。雖然安裝程序提供了為您配置PATH和PATHEXT變量的選項(xiàng),但這僅適用于單版本、全局安裝。如果您經(jīng)常使用多個版本的Python,請考慮使用 適用于Windows的Python啟動器 。

4.6.1. 附錄:設(shè)置環(huán)境變量?

Windows允許在用戶級別和系統(tǒng)級別永久配置環(huán)境變量,或臨時在命令提示符中配置環(huán)境變量。

要臨時設(shè)置環(huán)境變量,請打開命令提示符并使用 set 命令:

C:\>set PATH=C:\Program Files\Python 3.9;%PATH%
C:\>set PYTHONPATH=%PYTHONPATH%;C:\My_python_lib
C:\>python

這些環(huán)境變量的更改將應(yīng)用??于在該控制臺中執(zhí)行的任何其他命令,并且,由該控制臺啟動的任何應(yīng)用程序都繼承設(shè)這些設(shè)置。

在百分號中包含的變量名將被現(xiàn)有值替換,允許在開始或結(jié)束時添加新值。通過將包含 python.exe 的目錄添加到開頭來修改 PATH 是確保啟動正確版本的Python的常用方法。

要永久修改默認(rèn)環(huán)境變量,請單擊“開始”并搜索“編輯環(huán)境變量”,或打開系統(tǒng)屬性的 高級系統(tǒng)設(shè)置 ,然后單擊 環(huán)境變量 按鈕。在此對話框中,您可以添加或修改用戶和系統(tǒng)變量。要更改系統(tǒng)變量,您需要對計算機(jī)進(jìn)行無限制訪問(即管理員權(quán)限)。

備注

Windows會將用戶變量串聯(lián)在系統(tǒng)變量 之后 ,這可能會在修改 PATH 時導(dǎo)致意外結(jié)果。

The PYTHONPATH variable is used by all versions of Python, so you should not permanently configure it unless the listed paths only include code that is compatible with all of your installed Python versions.

參見

https://docs.microsoft.com/en-us/windows/win32/procthread/environment-variables

Overview of environment variables on Windows

https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/set_1

The set command, for temporarily modifying environment variables

https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/setx

The setx command, for permanently modifying environment variables

4.6.2. 查找Python可執(zhí)行文件?

在 3.5 版更改.

除了使用自動創(chuàng)建的Python解釋器的開始菜單項(xiàng)之外,您可能還想在命令提示符下啟動Python。安裝程序有一個選項(xiàng)可以為您設(shè)置。

在安裝程序的第一頁上,可以選擇標(biāo)記為“將Python添加到環(huán)境變量”的選項(xiàng),以使安裝程序?qū)惭b位置添加到 PATH 。還添加了 Scripts\ 文件夾的位置。這允許你輸入 python 來運(yùn)行解釋器,并且 pip 用于包安裝程序。因此,您還可以使用命令行選項(xiàng)執(zhí)行腳本,請參閱 命令行 文檔。

如果在安裝時未啟用此選項(xiàng),則始終可以重新運(yùn)行安裝程序,選擇“修改”并啟用它?;蛘撸梢允褂?附錄:設(shè)置環(huán)境變量 的方法手動修改 PATH 。您需要將Python安裝目錄添加到 PATH 環(huán)境變量中,該內(nèi)容與其他條目用分號分隔。示例變量可能如下所示(假設(shè)前兩個條目已經(jīng)存在):

C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files\Python 3.9

4.7. UTF-8 模式?

3.7 新版功能.

Windows still uses legacy encodings for the system encoding (the ANSI Code Page). Python uses it for the default encoding of text files (e.g. locale.getencoding()).

這可能會造成問題,因?yàn)橐蛱鼐W(wǎng)和大多數(shù) Unix 系統(tǒng)包括 WSL (Windows Subsystem for Linux) 廣泛使用 UTF-8。

你可以使用 Python UTF-8 模式 將默認(rèn)的文本編碼格式改為 UTF-8。 要啟用 Python UTF-8 模式 可以通過 -X utf8 命令行選項(xiàng),或者 PYTHONUTF8=1 環(huán)境變量。 請參閱 PYTHONUTF8 了解如何啟用 UTF-8 模式,并參閱 附錄:設(shè)置環(huán)境變量 了解如何修改環(huán)境變量。

當(dāng) Python UTF-8 模式 啟用時,你仍然可以通過 "mbcs" 編解碼器使用系統(tǒng)編碼格式(ANSI 代碼頁)。

請注意添加 PYTHONUTF8=1 到默認(rèn)環(huán)境變量將會影響你的系統(tǒng)中的所有 Python 3.7+ 應(yīng)用。 如果你有任何 Python 3.7+ 應(yīng)用仍然依賴于傳統(tǒng)的系統(tǒng)編碼格式,則推薦設(shè)置臨時環(huán)境變量或使用 -X utf8 命令行選項(xiàng)。

備注

即使在不啟用 UTF-8 模式時,Windows 版的 Python 也會在以下情況中默認(rèn)使用 UTF-8:

4.8. 適用于Windows的Python啟動器?

3.3 新版功能.

用于Windows的Python啟動器是一個實(shí)用程序,可幫助定位和執(zhí)行不同的Python版本。它允許腳本(或命令行)指示特定Python版本的首選項(xiàng),并將定位并執(zhí)行該版本。

PATH 變量不同,啟動器將正確選擇最合適的Python版本。它更傾向于按用戶安裝而不是系統(tǒng)安裝,并按語言版本排序,而不是使用最新安裝的版本。

啟動器最初是在 PEP 397 中指定的。

4.8.1. 入門?

4.8.1.1. 從命令行?

在 3.6 版更改.

System-wide installations of Python 3.3 and later will put the launcher on your PATH. The launcher is compatible with all available versions of Python, so it does not matter which version is installed. To check that the launcher is available, execute the following command in Command Prompt:

py

您應(yīng)該會發(fā)現(xiàn)已安裝的最新版本的Python已啟動 - 它可以正常退出,并且將指定的任何其他命令行參數(shù)直接發(fā)送到Python。

If you have multiple versions of Python installed (e.g., 3.7 and 3.12) you will have noticed that Python 3.12 was started - to launch Python 3.7, try the command:

py -3.7

If you want the latest version of Python 2 you have installed, try the command:

py -2

You should find the latest version of Python 3.x starts.

If you see the following error, you do not have the launcher installed:

'py' is not recognized as an internal or external command,
operable program or batch file.

除非在安裝時選擇了該選項(xiàng),單個用戶安裝的Python不會將啟動程序添加到 PATH 。

The command:

py --list

displays the currently installed version(s) of Python.

4.8.1.2. 從虛擬環(huán)境?

3.5 新版功能.

如果啟動程序運(yùn)行時沒有明確的Python版本,并且虛擬環(huán)境(使用標(biāo)準(zhǔn)庫創(chuàng)建 venv 模塊或外部 virtualenv 工具)處于活動狀態(tài),則啟動程序?qū)⑦\(yùn)行虛擬環(huán)境的解釋器而不是全局的。要運(yùn)行全局解釋器,請停用虛擬環(huán)境,或顯式指定全局Python版本。

4.8.1.3. 從腳本?

讓我們創(chuàng)建一個測試Python腳本 - 創(chuàng)建一個名為``hello.py``的文件,其中包含以下內(nèi)容

#! python
import sys
sys.stdout.write("hello from Python %s\n" % (sys.version,))

From the directory in which hello.py lives, execute the command:

py hello.py

您應(yīng)該注意到最新的Python 2.x安裝的版本號已打印出來。現(xiàn)在嘗試將第一行更改為:

#! python3

Re-executing the command should now print the latest Python 3.x information. As with the above command-line examples, you can specify a more explicit version qualifier. Assuming you have Python 3.7 installed, try changing the first line to #! python3.7 and you should find the 3.12 version information printed.

請注意,與交互式使用不同,裸“python”將使用您已安裝的Python 2.x的最新版本。這是為了向后兼容及兼容Unix,其中命令 python 通常是指Python 2。

4.8.1.4. 從文件關(guān)聯(lián)?

安裝時應(yīng)該將啟動器與Python文件(即 .py, .pyw, .pyc 文件)相關(guān)聯(lián)。這意味著當(dāng)您從Windows資源管理器中雙擊其中一個文件時,將使用啟動程序,因此您可以使用上述相同的工具讓腳本指定應(yīng)使用的版本。

這樣做的主要好處是,單個啟動程序可以同時支持多個Python版本,具體取決于第一行的內(nèi)容。

4.8.2. Shebang Lines?

如果腳本文件的第一行以 #! 開頭,則稱為 "shebang" 行。Linux和其他類Unix操作系統(tǒng)都有對這些行的本機(jī)支持,它們通常在此類系統(tǒng)上用來指示應(yīng)該如何執(zhí)行腳本。這個啟動器允許在Windows上對Python腳本使用相同的工具,上面的示例演示了它們的使用。

為了允許Python腳本中的shebang行在Unix和Windows之間移植,該啟動器支持許多“虛擬”命令來指定要使用的解釋器。支持的虛擬命令是:

  • /usr/bin/env python

  • /usr/bin/python

  • /usr/local/bin/python

  • python

例如,如果腳本開始的第一行

#! /usr/bin/python

將找到并使用默認(rèn)的Python。因?yàn)樵赨nix上編寫的許多Python腳本已經(jīng)有了這一行,你應(yīng)該發(fā)現(xiàn)這些腳本可以由啟動器使用而無需修改。如果您在Windows上編寫一個新腳本,希望在Unix上有用,那么您應(yīng)該使用以 /usr 開頭的一個shebang行。

Any of the above virtual commands can be suffixed with an explicit version (either just the major version, or the major and minor version). Furthermore the 32-bit version can be requested by adding "-32" after the minor version. I.e. /usr/bin/python3.7-32 will request usage of the 32-bit python 3.7.

3.7 新版功能: 從python啟動程序3.7開始,可以通過“-64”后綴調(diào)用64位版本。此外,可以指定沒有次要的主要和架構(gòu)(即 /usr/bin/python3-64 )。

在 3.11 版更改: The "-64" suffix is deprecated, and now implies "any architecture that is not provably i386/32-bit". To request a specific environment, use the new -V:<TAG> argument with the complete tag.

shebang line的 /usr/bin/env 形式還有一個特殊屬性。在尋找已安裝的Python解釋器之前,此表單將搜索可執(zhí)行文件 PATH 以獲取Python可執(zhí)行文件。這對應(yīng)于Unix中 env 程序的行為,該程序?qū)⒃?PATH 執(zhí)行搜索。

4.8.3. shebang lines 的參數(shù)?

shebang lines 還可以指定要傳遞給Python解釋器的其他選項(xiàng)。例如,如果你有一個shebang lines :

#! /usr/bin/python -v

然后Python將以 -v 選項(xiàng)啟動

4.8.4. 自定義?

4.8.4.1. 通過INI文件自定義?

啟動程序?qū)⑺阉鲀蓚€.ini文件 - 在當(dāng)前用戶的 "application data" 目錄中搜索 py.ini (即通過使用 CSIDL_LOCAL_APPDATA 調(diào)用Windows函數(shù) SHGetFolderPath 返回的目錄)以及與啟動器位于同一目錄中的 py.ini 。相同的.ini文件既用于啟動器的“控制臺”版本(即 py.exe),也用于“windows”版本(即pyw.exe)

“應(yīng)用程序目錄”中指定的自定義優(yōu)先于可執(zhí)行文件旁邊.ini文件的自定義,因此對啟動程序旁邊的.ini文件不具有寫訪問權(quán)限的用戶可以覆蓋該全局.ini文件中的命令。

4.8.4.2. 自定義默認(rèn)的Python版本?

在某些情況下,可以在命令中包含版本限定符,以指定命令將使用哪個Python版本。版本限定符以主版本號開頭,可以選擇后跟 ('.') 和次版本說明符。此外,可以通過添加 "-32" 或 “-64” 來指定是請求32位還是64位實(shí)現(xiàn)。

例如,一個shebang line 的 #!python 行沒有版本限定符,而 #!python3 有一個版本限定符,它只指定一個主要版本。

如果在命令中找不到版本限定符,則可以設(shè)置環(huán)境變量 PY_PYTHON 以指定默認(rèn)版本限定符。 如果未設(shè)置,則默認(rèn)為 "3"。 該變量可以指定能通過命令行傳遞的任何值,比如 "3", "3.7", "3.7-32" 或 "3.7-64"。 (請注意 "-64" 選項(xiàng)僅適用于 Python 3.7 或更高版本中包含的啟動器。)

如果沒有找到次要版本限定符,則可以設(shè)置環(huán)境變量 PY_PYTHON{major} (其中 {major} 是上面確定的當(dāng)前主要版本限定符)以指定完整版本。如果沒有找到這樣的選項(xiàng),啟動器將枚舉已安裝的Python版本并使用為主要版本找到的最新次要版本,盡管不能保證,但該版本可能是該系列中最新安裝的版本。

在安裝了相同(major.minor)Python版本的32位和64位的64位Windows上,64位版本將始終是首選。對于啟動程序的32位和64位實(shí)現(xiàn)都是如此 -- 這對于啟動程序32位和64位都是正確的 -- 如果可用,32位啟動程序?qū)A向于執(zhí)行指定版本的64位Python安裝。這樣就可以預(yù)測啟動器的行為,只知道PC上安裝了哪些版本,而不考慮它們的安裝順序(即,不知道32位或64位版本的Python和相應(yīng)的啟動器是否是最后安裝)。如上所述,可以在版本說明符上使用可選的“-32”或“-64”后綴來更改此行為。

示例:

  • 如果沒有設(shè)置相關(guān)選項(xiàng),命令 pythonpython2 將使用安裝的最新Python 2.x版本,命令 python3 將使用最新安裝的Python 3.x.

  • The command python3.7 will not consult any options at all as the versions are fully specified.

  • 如果 PY_PYTHON=3 ,命令``python`` 和 python3 都將使用最新安裝的Python 3版本。

  • If PY_PYTHON=3.7-32, the command python will use the 32-bit implementation of 3.7 whereas the command python3 will use the latest installed Python (PY_PYTHON was not considered at all as a major version was specified.)

  • If PY_PYTHON=3 and PY_PYTHON3=3.7, the commands python and python3 will both use specifically 3.7

除環(huán)境變量外,還可以在啟動程序使用的.INI文件中配置相同的設(shè)置。 INI文件中的部分稱為 [defaults] ,鍵名稱將與沒有前導(dǎo) PY_ 前綴的環(huán)境變量相同(并注意INI文件中的鍵名不區(qū)分大小寫) 。)環(huán)境變量的內(nèi)容將覆蓋INI文件中指定的內(nèi)容。

例如:

  • Setting PY_PYTHON=3.7 is equivalent to the INI file containing:

[defaults]
python=3.7
  • Setting PY_PYTHON=3 and PY_PYTHON3=3.7 is equivalent to the INI file containing:

[defaults]
python=3
python3=3.7

4.8.5. 診斷?

If an environment variable PYLAUNCHER_DEBUG is set (to any value), the launcher will print diagnostic information to stderr (i.e. to the console). While this information manages to be simultaneously verbose and terse, it should allow you to see what versions of Python were located, why a particular version was chosen and the exact command-line used to execute the target Python. It is primarily intended for testing and debugging.

4.8.6. Dry Run?

If an environment variable PYLAUNCHER_DRYRUN is set (to any value), the launcher will output the command it would have run, but will not actually launch Python. This may be useful for tools that want to use the launcher to detect and then launch Python directly. Note that the command written to standard output is always encoded using UTF-8, and may not render correctly in the console.

4.8.7. Install on demand?

If an environment variable PYLAUNCHER_ALLOW_INSTALL is set (to any value), and the requested Python version is not installed but is available on the Microsoft Store, the launcher will attempt to install it. This may require user interaction to complete, and you may need to run the command again.

An additional PYLAUNCHER_ALWAYS_INSTALL variable causes the launcher to always try to install Python, even if it is detected. This is mainly intended for testing (and should be used with PYLAUNCHER_DRYRUN).

4.8.8. Return codes?

The following exit codes may be returned by the Python launcher. Unfortunately, there is no way to distinguish these from the exit code of Python itself.

The names of codes are as used in the sources, and are only for reference. There is no way to access or resolve them apart from reading this page. Entries are listed in alphabetical order of names.

名稱

Value

描述

RC_BAD_VENV_CFG

107

A pyvenv.cfg was found but is corrupt.

RC_CREATE_PROCESS

101

Failed to launch Python.

RC_INSTALLING

111

An install was started, but the command will need to be re-run after it completes.

RC_INTERNAL_ERROR

109

Unexpected error. Please report a bug.

RC_NO_COMMANDLINE

108

Unable to obtain command line from the operating system.

RC_NO_PYTHON

103

Unable to locate the requested version.

RC_NO_VENV_CFG

106

A pyvenv.cfg was required but not found.

4.9. 查找模塊?

These notes supplement the description at The initialization of the sys.path module search path with detailed Windows notes.

當(dāng)找不到 ._pth 文件時, sys.path 是如何在Windows上填充的:

  • 在開始時,添加一個空條目,該條目對應(yīng)于當(dāng)前目錄。

  • 如果環(huán)境變量 PYTHONPATH 存在,如 環(huán)境變量 中所述,則接下來添加其條目。請注意,在Windows上,此變量中的路徑必須用分號分隔,以區(qū)別于驅(qū)動器標(biāo)識符中使用的冒號( C:\ 等)。

  • 額外的 "應(yīng)用程序路徑" 可以作為子鍵被同時添加到注冊表 HKEY_CURRENT_USERHKEY_LOCAL_MACHINE 分支下的 \SOFTWARE\Python\PythonCore{version}\PythonPath 中。 以分號分隔的路徑字符串作為默認(rèn)值的子鍵將導(dǎo)致每個路徑都被添加到 sys.path 中。 (請注意所有已知的安裝程序都只使用 HKLM,因此 HKCU 通常為空。)

  • 如果設(shè)置了環(huán)境變量 PYTHONHOME ,則將其假定為 “Python 主目錄” 。否則,主Python可執(zhí)行文件的路徑用于定位 “l(fā)andmark 文件” ( Lib\os.pypythonXY.zip )以推斷 ”Python 主目錄“ 。如果找到了Python主目錄,則基于該文件夾將相關(guān)的子目錄添加到 sys.pathLib , plat-win 等)。否則,核心Python路徑是從存儲在注冊表中的PythonPath構(gòu)造的。

  • 如果找不到Python Home,也沒有指定 PYTHONPATH 環(huán)境變量,并且找不到注冊表項(xiàng),則使用具有相對條目的默認(rèn)路徑(例如 .\Lib; .\plat-win 等等)。

如果在主可執(zhí)行文件旁邊或在可執(zhí)行文件上一級的目錄中找到 pyvenv.cfg 文件,則以下變體適用:

  • 如果 home 是一個絕對路徑,并且 PYTHONHOME 未設(shè)置,則在推斷起始位置時使用此路徑而不是主可執(zhí)行文件的路徑。

這一切的最終結(jié)果是:

  • 運(yùn)行 python.exe ,或主Python目錄中的任何其他.exe(安裝版本,或直接來自PCbuild目錄)時,推導(dǎo)出核心路徑,并忽略注冊表中的核心路徑。始終讀取注冊表中的其他“應(yīng)用程序路徑”。

  • 當(dāng)Python托管在另一個.exe(不同的目錄,通過COM嵌入等)時,將不會推斷出“Python Home”,因此使用了來自注冊表的核心路徑。始終讀取注冊表中的其他“應(yīng)用程序路徑”。

  • 如果Python找不到它的主目錄并且沒有注冊表值(凍結(jié)的.exe,一些非常奇怪的安裝設(shè)置),那么你會得到一條帶有一些默認(rèn)但相對的路徑的路徑。

對于那些想要將Python捆綁到其應(yīng)用程序或發(fā)行版中的人,以下建議將防止與其他安裝沖突:

  • 在您的可執(zhí)行文件中包含一個 ._pth 文件,其中包含目錄。這將忽略注冊表和環(huán)境變量中列出的路徑,并忽略 site ,除非列出 import site

  • 如果你在自己的可執(zhí)行文件中加載 python3.dllpython37.dll ,在 Py_Initialize() 之前,要顯式調(diào)用 Py_SetPath() 或(至少) Py_SetProgramName()

  • 清除 和/或 覆蓋 PYTHONPATH 并在啟動來自應(yīng)用程序的 python.exe 之前設(shè)置 PYTHONHOME

  • 如果您不能使用前面的建議(例如,您是一個允許人們直接運(yùn)行 python.exe 的分發(fā)版),請確保安裝目錄中存在 landmark 文件 (Lib\os.py)。 (請注意,在 ZIP 文件中不會檢測到該文件,但會檢測到正確命名的 ZIP 文件。)

這些將確保系統(tǒng)范圍安裝中的文件不會優(yōu)先于與應(yīng)用程序捆綁在一起的標(biāo)準(zhǔn)庫的副本。否則,用戶可能會在使用您的應(yīng)用程序時遇到問題請注意,第一個建議是最好的,因?yàn)槠渌ㄗh可能仍然容易受到注冊表和用戶站點(diǎn)包中的非標(biāo)準(zhǔn)路徑的影響。

在 3.6 版更改:

  • 添加 ._pth 文件支持并從 pyvenv.cfg 中刪除 applocal 選項(xiàng)

  • 當(dāng)直接與可執(zhí)行文件相鄰時,添加 pythonXX.zip 作為潛在的 landmark 。

3.6 版后已移除:

Modules (不是 PythonPath )下的注冊表中指定的模塊可以通過以下方式導(dǎo)入 importlib.machinery.WindowsRegistryFinder 。在Windows上,此查找程序在3.6.0及更早版本的可用,但可能需要在將來顯式添加到 sys.meta_path

4.10. 附加模塊?

盡管Python的目標(biāo)是在所有平臺中都可移植,但是Windows有一些獨(dú)特的特性。在標(biāo)準(zhǔn)庫和外部都有一些模塊和代碼片段在使用這些特性。

特定于Windows的標(biāo)準(zhǔn)模塊記錄在 Windows系統(tǒng)相關(guān)模塊 中。

4.10.1. PyWin32?

Mark Hammond 的 PyWin32 模塊是一組用于高級Windows特定支持的模塊。這包括以下實(shí)用程序:

PythonWin 是PyWin32附帶的一個示例MFC應(yīng)用程序。它是一個內(nèi)置調(diào)試器的可嵌入IDE。

參見

Win32 How Do I...?

Tim Golden 著

Python and COM

David 和 Paul Boddie 著

4.10.2. cx_Freeze?

cx_Freeze 是一個 distutils 的擴(kuò)展 (參見 擴(kuò)展 Distutils),它將 Python 腳本包裝成可執(zhí)行的 Windows 程序 (*.exe 文件)。 完成此操作后,你就可以分發(fā)你的應(yīng)用程序而無需用戶安裝 Python。

4.11. 在Windows上編譯Python?

如果你想自己編譯CPython,首先要做的是獲取 source. 。您可以下載最新版本的源代碼,也可以重新簽出 checkout. 。

The source tree contains a build solution and project files for Microsoft Visual Studio, which is the compiler used to build the official Python releases. These files are in the PCbuild directory.

檢查 PCbuild/readme.txt 以獲取有關(guān)構(gòu)建過程的一般信息。

有關(guān)擴(kuò)展模塊,請參閱 在 Windows 上構(gòu)建 C 和 C++ 擴(kuò)展 。

4.12. 其他平臺?

隨著Python的不斷發(fā)展,不再支持以前曾經(jīng)支持的一些平臺(由于缺少用戶或開發(fā)人員)。檢查 PEP 11 了解所有不支持的平臺的詳細(xì)信息。

有關(guān)具有預(yù)編譯安裝程序平臺的詳細(xì)信息,請參閱 Python for Windows