3. 在Windows上使用 Python?

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

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

PEP 11 中所述,Python 僅支持微軟產(chǎn)品支持生命周期內(nèi)的Windows 版本。這意味著 Python 3.7 支持Windows Vista和更新版本。如果需要Windows XP支持,請安裝Python 3.4。

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

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

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

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

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

3.1. 完整安裝程序?

3.1.1. 安裝步驟?

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

啟動安裝程序后,可以選擇以下兩個選項之一:

../_images/win_installer.png

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

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

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

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

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

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

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

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

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

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

  • Python 將安裝到Program Files目錄中

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

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

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

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

  • 快捷方式所有用戶可用

3.1.2. 刪除 MAX_PATH 限制?

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

在最新版本的Windows中,此限制可以擴(kuò)展到大約32,000個字符。但需要管理員權(quán)限激活 “啟用Win32長路徑” 組策略,或?qū)⒆员碇?HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem@LongPathsEnabled 設(shè)置為 1

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

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

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

3.1.3. 無UI 安裝?

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

要完全隱藏安裝程序UI并靜默安裝Python,請使用 /quiet 選項。要跳過用戶交互但仍然顯示進(jìn)度和錯誤,請使用 /passive 選項??梢酝ㄟ^ /uninstall 選項立即開始刪除Python - - 不會顯示任何提示。

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

名稱

描述

默認(rèn)值

InstallAllUsers

執(zhí)行全局安裝。

0

TargetDir

安裝目錄

基于InstallAllUsers選擇

DefaultAllUsersTargetDir

所有用戶安裝的默認(rèn)安裝目錄

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

DefaultJustForMeTargetDir

僅為我安裝的默認(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

將install和Scripts目錄添加到 PATH 以及將 .PY 添加到 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

安裝實用程序腳本

1

LauncherOnly

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

0

SimpleInstall

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

0

SimpleInstallDescription

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

(空)

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

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

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

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

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

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

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

3.1.4. 免下載安裝?

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

從命令提示符執(zhí)行以下命令以下載所有可能的必需文件。請記住用 python-3.7.0.exe 替換安裝程序的實際名稱,并在自己的目錄中創(chuàng)建布局以避免具有相同名稱的文件之間發(fā)生沖突。

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

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

3.1.5. 修改安裝?

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

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

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

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

3.2. Microsoft Store包?

3.7.2 新版功能.

注解

Microsoft Store包當(dāng)前被認(rèn)為是不穩(wěn)定的,同時評估了它與其他工具和其他Python副本的交互。雖然Python本身是穩(wěn)定的,但這種安裝方法可能會在Python 3.7版本中改變其行為和功能。

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

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

警告

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

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

所有這三個命令也可以使用版本號后綴,例如, python3.exepython3.x.exe 以及 python.exe (其中 3.x 是您要啟動的特定版本,例如 3.7 )

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

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

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

3.2.1. 已知的問題?

目前, py.exe 啟動程序在從Microsoft Store安裝時不能用于啟動Python。

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

3.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 .

要選擇特定版本,請?zhí)砑?-Version 3.x.y 。輸出目錄可以從 . 更改,包將安裝到子目錄中。默認(rèn)情況下,子目錄的名稱與包的名稱相同,如果沒有 -ExcludeVersion 選項,則此名稱將包含已安裝的特定版本。子目錄里面是一個包含Python安裝的 tools 目錄:

# 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++項目中使用該文件來引用Python安裝。包含這些設(shè)置將自動在生成中使用標(biāo)頭和導(dǎo)入庫。

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

3.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.dll , python37.dll , python.exepythonw.exe 文件。不包括Tcl/tk(包括所有依賴項,如Idle),pip和Python文檔。

注解

嵌入式發(fā)行版不包括 Microsoft C Runtime ,應(yīng)用程序安裝程序負(fù)責(zé)提供此功能。運行時可能已經(jīng)預(yù)先安裝在用戶的系統(tǒng)上或通過Windows Update自動安裝,并且可以通過在系統(tǒng)目錄中找到 ucrtbase.dll 來檢測

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

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

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

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

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

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

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

3.4.2. 嵌入Python?

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

與應(yīng)用程序使用一樣,包可以安裝到任何位置,因為在初始化解釋器之前有機會指定搜索路徑。否則,使用嵌入式發(fā)行版和常規(guī)安裝之間沒有根本區(qū)別。

3.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)隊維護(hù)或支持。

3.6. 配置Python?

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

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

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

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

C:\>set PATH=C:\Program Files\Python 3.7;%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)屬性” Advanced system settings ,然后單擊 Environment Variables 按鈕。在此對話框中,您可以添加或修改用戶和系統(tǒng)變量。要更改系統(tǒng)變量,您需要對計算機進(jìn)行無限制訪問(即管理員權(quán)限)。

注解

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

PYTHONPATH 變量被Python 2和Python 3的所有版本使用,因此除非它只包含與所有已安裝的Python版本兼容的代碼,否則不要永久配置此變量。

參見

https://www.microsoft.com/en-us/wdsi/help/folder-variables

Windows NT 的環(huán)境變量

https://technet.microsoft.com/en-us/library/cc754250.aspx

用于臨時修改環(huán)境變量的SET命令

https://technet.microsoft.com/en-us/library/cc755104.aspx

用于永久修改環(huán)境變量的SETX命令

https://support.microsoft.com/en-us/help/310519/how-to-manage-environment-variables-in-windows-xp

如何在Windows XP中管理環(huán)境變量

https://www.chem.gla.ac.uk/~louis/software/faq/q1.html

設(shè)置環(huán)境變量(For Windows 2000/NT),Louis J. Farrugia

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

在 3.5 版更改.

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

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

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

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

3.7. UTF-8 模式?

3.7 新版功能.

Windows 仍然使用傳統(tǒng)編碼格式作為系統(tǒng)的編碼格式(ANSI 代碼頁)。 Python 使用它作為文本文件默認(rèn)的編碼格式 (即 locale.getpreferredencoding())。

這可能會造成問題,因為因特網(wǎng)和大多數(shù) Unix 系統(tǒng)包括 WSL (Windows Subsystem for Linux) 廣泛使用 UTF-8。

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

當(dāng) UTF-8 模式被啟用時:

  • locale.getpreferredencoding() 將返回 'UTF-8' 而不是系統(tǒng)的編碼格式。 此函數(shù)可用來在許多場合下獲取默認(rèn)的文本編碼格式,包括 open(), Popen, Path.read_text() 等等。

  • sys.stdin, sys.stdoutsys.stderr 都將使用 UTF-8 作為其文本編碼格式。

  • 你仍然可以通過 "mbcs" 編解碼器來使用系統(tǒng)的編碼格式。

請注意添加 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 命令行選項。

注解

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

  • 控制臺 I/O 包括標(biāo)準(zhǔn) I/O (詳情見 PEP 528)。

  • 文件系統(tǒng)編碼格式 (詳情見 PEP 529)。

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

3.3 新版功能.

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

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

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

3.8.1. 入門?

3.8.1.1. 從命令行?

在 3.6 版更改.

全局安裝Python 3.3及更高版本將把啟動器放在你的 PATH 上。啟動程序與所有可用的Python版本兼容,因此安裝哪個版本無關(guān)緊要。要檢查啟動程序是否可用,請在命令提示符中執(zhí)行以下命令:

py

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

如果您安裝了多個版本的Python(例如,2.7和 3.7 ),您會注意到Python 3.7 啟動 - 如果要啟動Python 2.7,嘗試命令:

py -2.7

如果您想使用 Python 2.x 的最新版本,請嘗試以下命令:

py -2

你會發(fā)現(xiàn)Python 2.x 的最新版本已啟動。

如果您看到以下錯誤,則表明您沒有安裝啟動器:

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

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

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

3.5 新版功能.

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

3.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,))

從hello.py所在的目錄中,執(zhí)行以下命令:

py hello.py

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

#! python3

現(xiàn)在,重新執(zhí)行該命令應(yīng)該打印最新的Python 3.x信息。與上面的命令行示例一樣,你可以更明確的指定版本限定符。假設(shè)您安裝了Python 2.6,請嘗試將第一行更改為 #! python2.6 ,你會發(fā)現(xiàn)打印的2.6版本信息。

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

3.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)容。

3.8.2. Shebang Lines?

如果腳本文件的第一行以 #! 開頭,則稱為 "shebang" 行。Linux和其他類Unix操作系統(tǒng)都有對這些行的本機支持,它們通常在此類系統(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。因為在Unix上編寫的許多Python腳本已經(jīng)有了這一行,你應(yīng)該發(fā)現(xiàn)這些腳本可以由啟動器使用而無需修改。如果您在Windows上編寫一個新腳本,希望在Unix上有用,那么您應(yīng)該使用以 /usr 開頭的一個shebang行。

任何上述虛擬命令都可以顯式指定版本(可以僅為主要版本,也可以為主要版本加次要版本)作為后綴。 此外,可以通過在次要版本之后添加 “-32” 來請求 32 位版本。 例如 /usr/bin/python2.7-32 將請求使用 32 位 python 2.7。

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

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

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

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

#! /usr/bin/python -v

然后Python將以 -v 選項啟動

3.8.4. 自定義?

3.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文件中的命令。

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

在某些情況下,可以在命令中包含版本限定符,以指示命令將使用哪個版本的Python。版本限定符以主版本號開頭,可以選擇后跟句點 ('.') 和次版本說明符。此外,可以通過添加“-32”或“-64”來指定是否應(yīng)該調(diào)用32位或64位實現(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" 選項僅適用于 Python 3.7 或更高版本中包含的啟動器。)

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

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

示例:

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

  • 命令 python3.1python2.7 根本不會查閱任何選項,因為版本已完全指定。

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

  • 如果 PY_PYTHON=3.1-32 ,命令 python 將使用3.1的32位實現(xiàn),而命令 python3 將使用最新安裝的Python(PY_PYTHON根本沒有被視為指定了主要版本。)

  • 如果 PY_PYTHON=3PY_PYTHON3=3.1,命令 pythonpython3 都將特別使用3.1

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

例如:

  • 設(shè)置 PY_PYTHON=3.1 等同于包含以下內(nèi)容的INI文件:

[defaults]
python=3.1
  • 設(shè)置 PY_PYTHON=3PY_PYTHON3=3.1 相當(dāng)于包含以下內(nèi)容的INI文件:

[defaults]
python=3
python3=3.1

3.8.5. 診斷?

如果設(shè)置了環(huán)境變量 PYLAUNCH_DEBUG (任何值),啟動器將診斷信息打印到stderr(即:控制臺)。雖然這些信息同時具有冗長 簡潔性,但它應(yīng)該允許您查看Python的版本、選擇特定版本的原因以及用于執(zhí)行目標(biāo)Python的確切命令行。

3.9. 查找模塊?

Python通常將其庫(以及您的site-packages文件夾)存儲在安裝目錄中。因此,如果您已將Python安裝到 C:\Python\ ,則默認(rèn)庫將駐留在 C:\Python\Lib\ 中,第三方模塊存儲在 C:\Python\Lib\site-packages\

若要完全覆蓋 sys.path ,請創(chuàng)建與DLL(python37._pth)或可執(zhí)行文件(“python._pth`”)同名的 ._pth 文件,并為要添加的每個路徑指定一行 sys.path ?;贒LL名稱的文件覆蓋基于可執(zhí)行文件的文件,如果需要,可以為加載運行時的任何程序限制路徑。

當(dāng)文件存在時,將忽略所有注冊表和環(huán)境變量,啟用隔離模式,并且:除非文件中的一行指定 import site ,否則不會導(dǎo)入 site 。以 開頭的空白路徑和行將被忽略。每個路徑可以是絕對的或相對于文件的位置。不允許使用除 site 以外的導(dǎo)入語句,并且不能指定任意代碼。

請注意,當(dāng)指定 import site 時, .pth 文件(沒有前導(dǎo)下劃線)將由 site 模塊正常處理。

當(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)境變量,并且找不到注冊表項,則使用具有相對條目的默認(rèn)路徑(例如 .\Lib; .\plat-win 等等)。

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

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

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

  • 運行 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 。

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

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

在 3.6 版更改:
  • 添加 ._pth 文件支持并從 pyvenv.cfg 中刪除 applocal 選項

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

3.6 版后已移除:

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

3.10. 附加模塊?

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

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

3.10.1. PyWin32?

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

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

參見

Win32 How Do I...?

by Tim Golden

Python and COM

by David and Paul Boddie

3.10.2. cx_Freeze?

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

3.10.3. WConio?

由于Python的高級終端處理層 curses 僅限于類Unix系統(tǒng),因此Windows還有一個獨立的庫:用于Python的Windows 控制臺 I/O .

WConio 是Turbo-C的 CONIO.H 裝飾器,用于創(chuàng)建文本用戶界面。

3.11. 在Windows上編譯Python?

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

源代碼樹包含Microsoft Visual Studio 2015的構(gòu)建解決方案和項目文件,它是用于構(gòu)建官方Python版本的編譯器。這些文件位于 PCbuild 目錄中。

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

有關(guān)擴(kuò)展模塊,請參閱 在Windows平臺編譯C和C++擴(kuò)展 。

參見

Python + Windows + distutils + SWIG + gcc MinGW

或 "Creating Python extensions in C/C++ with SWIG and compiling them with MinGW gcc under Windows" 或 "Installing Python extension with distutils and without Microsoft Visual C++" by Sébastien Sauvage, 2003

MingW -- Python 擴(kuò)展

3.12. 其他平臺?

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

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