4. 在 Windows 上使用 Python — Python 文档
4. 在 Windows 上使用 Python
本文档旨在概述在 Microsoft Windows 上使用 Python 时应了解的特定于 Windows 的行为。
与大多数 Unix 系统和服务不同,Windows 不包括系统支持的 Python 安装。 为了使 Python 可用,多年来,CPython 团队在每个 版本 中都编译了 Windows 安装程序(MSI 包)。 这些安装程序主要用于添加每个用户的 Python 安装,核心解释器和库由单个用户使用。 安装程序还可以为一台机器的所有用户安装,并且一个单独的 ZIP 文件可用于应用程序本地分发。
根据 PEP 11 中的规定,Python 版本仅支持 Windows 平台,而 Microsoft 认为该平台具有扩展支持。 这意味着 Python 支持 Windows 8.1 和更新版本。 如果您需要 Windows 7 支持,请安装 Python 3.8。
有许多不同的安装程序可用于 Windows,每个都有特定的优点和缺点。
完整安装程序包含所有组件,是使用Python进行任何类型项目的开发人员的最佳选择。
微软商店包是Python的简单安装,适用于运行脚本和包,以及使用IDLE或其他开发环境。 它需要 Windows 10,但可以安全安装而不会损坏其他程序。 它还提供了许多方便的命令来启动 Python 及其工具。
nuget.org 包 是用于持续集成系统的轻量级安装。 它可用于构建 Python 包或运行脚本,但不可更新且没有用户界面工具。
可嵌入包是Python的最小包,适合嵌入到更大的应用程序中。
4.1. 完整的安装程序
4.1.1. 安装步骤
有四个 Python 安装程序可供下载——解释器的 32 位和 64 位版本各有两个。 web installer是一个小的初始下载,它会根据需要自动下载所需的组件。 离线安装程序 包括默认安装所需的组件,并且仅需要 Internet 连接才能使用可选功能。 有关避免在安装过程中下载的其他方法,请参阅 无需下载即可安装 。
启动安装程序后,可以选择以下两个选项之一:
../_images/win_installer.png 如果选择“立即安装”:
- 您将 不需要 成为管理员(除非需要 C 运行时库的系统更新或您为所有用户安装 Python Launcher for Windows)
- Python 将安装到您的用户目录中
- Python Launcher for Windows会根据第一页底部的选项安装
- 将安装标准库、测试套件、启动器和 pip
- 如果选择,安装目录将添加到您的
PATH
- 快捷方式仅对当前用户可见
选择“自定义安装”将允许您选择要安装的功能、安装位置和其他选项或安装后操作。 要安装调试符号或二进制文件,您需要使用此选项。
要执行所有用户安装,您应该选择“自定义安装”。 在这种情况下:
- 您可能需要提供管理凭据或批准
- Python 将安装到 Program Files 目录中
- Python Launcher for Windows 将安装到 Windows 目录中
- 安装过程中可以选择可选功能
- 标准库可以预编译为字节码
- 如果选择,安装目录将被添加到系统
PATH
- 快捷方式可供所有用户使用
4.1.2. 删除 MAX_PATH 限制
Windows 过去将路径长度限制为 260 个字符。 这意味着比这更长的路径将无法解析并导致错误。
在最新版本的 Windows 中,此限制可以扩展到大约 32,000 个字符。 您的管理员需要激活“启用 Win32 长路径”组策略,或在注册表项 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem
中将 LongPathsEnabled
设置为 1
。
这允许 open() 函数、os 模块和大多数其他路径功能接受和返回长度超过 260 个字符的路径。
更改上述选项后,无需进一步配置。
3.6 版更改: 在 Python 中启用了对长路径的支持。
4.1.3. 没有用户界面的安装
安装程序 UI 中可用的所有选项也可以从命令行指定,允许脚本安装程序在许多机器上复制安装,而无需用户交互。 也可以在不抑制 UI 的情况下设置这些选项以更改某些默认值。
要完全隐藏安装程序 UI 并静默安装 Python,请传递 /quiet
选项。 要跳过用户交互但仍显示进度和错误,请传递 /passive
选项。 可以传递 /uninstall
选项以立即开始删除 Python - 不会显示任何提示。
所有其他选项都作为 name=value
传递,其中值通常是 0
禁用功能,1
启用功能或路径。 可用选项的完整列表如下所示。
姓名 | 描述 | 默认 |
---|---|---|
安装所有用户 | 执行系统范围的安装。 | 0 |
目标目录 | 安装目录 | 根据 InstallAllUsers 选择 |
默认所有用户目标目录 | 所有用户安装的默认安装目录 | %ProgramFiles%\Python X.Y 或 %ProgramFiles(x86)%\Python X.Y
|
DefaultJustForMeTargetDir | just-for-me 安装的默认安装目录 | %LocalAppData%\Programs\PythonXY 或 %LocalAppData%\Programs\PythonXY-32 或 %LocalAppData%\Programs\PythonXY-64
|
默认自定义目标目录 | UI 中显示的默认自定义安装目录 | (空的) |
关联文件 | 如果还安装了启动器,则创建文件关联。 | 1 |
编译所有 | 将所有 .py 文件编译为 .pyc 。
|
0 |
前置路径 | 将安装和脚本目录添加到 PATH 和 .PY 到 PATHEXT
|
0 |
快捷方式 | 为解释器、文档和 IDLE(如果已安装)创建快捷方式。 | 1 |
包含_doc | 安装 Python 手册 | 1 |
include_debug | 安装调试二进制文件 | 0 |
include_dev | 安装开发者头文件和库 | 1 |
包含_exe | 安装python.exe 及相关文件
|
1 |
Include_launcher | 安装适用于 Windows 的 Python 启动器 。 | 1 |
安装启动器所有用户 | 为所有用户安装 Python Launcher for Windows。 | 1 |
包含_lib | 安装标准库和扩展模块 | 1 |
包含_pip | 安装捆绑的 pip 和 setuptools | 1 |
Include_symbols | 安装调试符号 (*.pdb) | 0 |
include_tcltk | 安装 Tcl/Tk 支持和 IDLE | 1 |
包含_测试 | 安装标准库测试套件 | 1 |
Include_tools | 安装实用程序脚本 | 1 |
仅启动器 | 只安装启动器。 这将覆盖大多数其他选项。 | 0 |
简单安装 | 禁用大多数安装 UI | 0 |
简单安装说明 | 使用简化安装 UI 时显示的自定义消息。 | (空的) |
例如,要静默安装默认的、系统范围的 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."
(请注意,省略启动器也会省略文件关联,并且仅当还有包含启动器的系统范围安装时才建议按用户安装。)
上面列出的选项也可以在名为 unattend.xml
的文件中与可执行文件一起提供。 此文件指定选项和值的列表。 当一个值作为属性提供时,如果可能,它将被转换为一个数字。 作为元素文本提供的值始终保留为字符串。 此示例文件设置与前一个示例相同的选项:
<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 连接。 为了避免这种需要,可以按需下载所有可能的组件以创建一个完整的 布局 ,无论所选功能如何,都不再需要 Internet 连接。 请注意,此下载可能比所需的大,但在将要执行大量安装的情况下,拥有本地缓存副本非常有用。
从命令提示符执行以下命令以下载所有可能的必需文件。 请记住将 python-3.9.0.exe
替换为安装程序的实际名称,并在它们自己的目录中创建布局以避免同名文件之间发生冲突。
python-3.9.0.exe /layout [optional target directory]
您也可以指定 /quiet
选项来隐藏进度显示。
4.1.5. 修改安装
安装 Python 后,您可以通过 Windows 中的程序和功能工具添加或删除功能。 选择 Python 条目并选择“卸载/更改”以在维护模式下打开安装程序。
“修改”允许您通过修改复选框来添加或删除功能 - 未更改的复选框不会安装或删除任何内容。 这种模式下有些选项是不能改变的,比如安装目录; 要修改这些,您需要完全删除并重新安装 Python。
“修复”将验证应使用当前设置安装的所有文件并替换任何已删除或修改的文件。
“卸载”将完全删除 Python,除了 Python Launcher for Windows,它在程序和功能中有自己的条目。
4.2. Microsoft Store 软件包
版本 3.7.2 中的新功能。
Microsoft Store 包是一个易于安装的 Python 解释器,主要用于交互式使用,例如,由学生使用。
要安装该程序包,请确保您拥有最新的 Windows 10 更新并在 Microsoft Store 应用程序中搜索“Python”。 确保您选择的应用程序是由 Python 软件基金会发布的,然后安装它。
警告
Python 将始终在 Microsoft Store 上免费提供。 如果要求您付款,则说明您没有选择正确的套餐。
安装后,可以通过在开始中找到 Python 来启动它。 或者,它可以通过键入 python
从任何命令提示符或 PowerShell 会话中使用。 此外,可以通过键入 pip
或 idle
来使用 pip 和 IDLE。 IDLE 也可以在 Start 中找到。
所有三个命令也都带有版本号后缀,例如 python3.exe
和 python3.x.exe
以及 python.exe
(其中 3.x
是您的特定版本)想要启动,例如)。 通过开始打开“Manage App Execution Aliases”,选择每个命令关联的Python版本。 建议确保pip
和idle
与选择的python
版本一致。
可以使用 python -m venv
创建虚拟环境并正常激活和使用。
如果您安装了另一个版本的 Python 并将其添加到 PATH
变量中,它将作为 python.exe
而不是 Microsoft Store 中的那个。 要访问新安装,请使用 python3.exe
或 python3.x.exe
。
py.exe
启动器将检测此 Python 安装,但更喜欢传统安装程序的安装。
要删除 Python,请打开“设置”并使用“应用程序和功能”,或者在“开始”中找到 Python 并右键单击以选择“卸载”。 卸载将删除您直接安装到此 Python 安装中的所有软件包,但不会删除任何虚拟环境
4.2.1. 已知的问题
由于 Microsoft Store 应用程序的限制,Python 脚本可能没有对共享位置(例如 TEMP
和注册表)的完全写入权限。 相反,它将写入私人副本。 如果您的脚本必须修改共享位置,您将需要安装完整的安装程序。
有关这些限制的技术基础的更多详细信息,请参阅 Microsoft 关于打包的完全信任应用程序的文档,目前可在 docs.microsoft.com/en-us/windows/msix/desktop/desktop-to-uwp-幕后花絮
4.3. nuget.org 包
版本 3.5.2 中的新功能。
nuget.org 包是缩小尺寸的 Python 环境,旨在用于没有系统范围安装 Python 的持续集成和构建系统。 虽然 nuget 是“.NET 的包管理器”,但它也适用于包含构建时工具的包。
有关使用 nuget 的最新信息,请访问 nuget.org。 以下是对 Python 开发人员来说足够的总结。
nuget.exe
命令行工具可以直接从https://aka.ms/nugetclidl
下载,例如使用curl或PowerShell。 使用该工具,可以使用以下命令安装适用于 64 位或 32 位机器的最新版本的 Python:
nuget.exe install python -ExcludeVersion -OutputDirectory .
nuget.exe install pythonx86 -ExcludeVersion -OutputDirectory .
要选择特定版本,请添加 -Version 3.x.y
。 输出目录可能由 .
更改,并且软件包将安装到子目录中。 默认情况下,子目录的名称与包相同,如果没有 -ExcludeVersion
选项,该名称将包含安装的特定版本。 子目录内是一个 tools
目录,其中包含 Python 安装:
# 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 包不可升级,较新的版本应并行安装并使用完整路径进行引用。 或者,手动删除包目录并重新安装。 如果许多 CI 系统不在构建之间保留文件,它们将自动执行此操作。
在 tools
目录旁边是一个 build\native
目录。 这包含一个 MSBuild 属性文件 python.props
,可用于 C++ 项目以引用 Python 安装。 包括设置将自动在您的构建中使用标头和导入库。
nuget.org 上的包信息页面是 www.nuget.org/packages/python(对于 64 位版本)和 www.nuget.org/packages/pythonx86(对于 32-位版本)位版。
4.4. 可嵌入包
3.5 版中的新功能。
嵌入式发行版是一个包含最小 Python 环境的 ZIP 文件。 它旨在充当另一个应用程序的一部分,而不是由最终用户直接访问。
提取后,嵌入式发行版(几乎)与用户系统完全隔离,包括环境变量、系统注册表设置和已安装的包。 标准库作为预编译和优化的 .pyc
文件包含在 ZIP 中,以及 python3.dll
、python37.dll
、python.exe
和 pythonw.exe
都提供。 不包括 Tcl/tk(包括所有依赖项,例如 Idle)、pip 和 Python 文档。
笔记
嵌入式发行版不包括 Microsoft C 运行时 ,应用程序安装程序负责提供此内容。 运行时可能之前已经安装在用户的系统上或通过 Windows 更新自动安装,并且可以通过在系统目录中找到 ucrtbase.dll
来检测。
第三方软件包应由应用程序安装程序与嵌入式发行版一起安装。 此发行版不支持像常规 Python 安装一样使用 pip 来管理依赖项,但可以谨慎地包含和使用 pip 进行自动更新。 通常,第三方包应被视为应用程序的一部分(“供应商”),以便开发人员可以在向用户提供更新之前确保与较新版本的兼容性。
下面描述了此分发的两个推荐用例。
4.4.1. 蟒蛇应用
用 Python 编写的应用程序不一定需要用户知道这一事实。 在这种情况下,可以使用嵌入式发行版将 Python 的私有版本包含在安装包中。 根据它应该有多透明(或者相反,它应该看起来有多专业),有两种选择。
使用专门的可执行文件作为启动器需要一些编码,但可以为用户提供最透明的体验。 使用自定义启动器,没有明显迹象表明程序在 Python 上运行:可以自定义图标,可以指定公司和版本信息,文件关联行为正常。 在大多数情况下,自定义启动器应该能够简单地使用硬编码命令行调用 Py_Main
。
更简单的方法是提供一个批处理文件或生成的快捷方式,使用所需的命令行参数直接调用 python.exe
或 pythonw.exe
。 在这种情况下,应用程序将显示为 Python 而不是其实际名称,用户可能无法将其与其他正在运行的 Python 进程或文件关联区分开来。
使用后一种方法,包应该作为 Python 可执行文件旁边的目录安装,以确保它们在路径上可用。 使用专门的启动器,包可以位于其他位置,因为有机会在启动应用程序之前指定搜索路径。
4.4.2. 嵌入 Python
用本机代码编写的应用程序通常需要某种形式的脚本语言,而嵌入式 Python 发行版可用于此目的。 一般情况下,应用程序的大部分是本地代码,有些部分会调用python.exe
或直接使用python3.dll
。 对于任何一种情况,将嵌入式分发提取到应用程序安装的子目录就足以提供可加载的 Python 解释器。
与应用程序使用一样,包可以安装到任何位置,因为有机会在初始化解释器之前指定搜索路径。 否则,使用嵌入式发行版和常规安装之间没有根本区别。
4.5. 替代捆绑包
除了标准的 CPython 发行版,还有包含附加功能的修改包。 以下是流行版本及其主要功能的列表:
- 活动Python
- 具有多平台兼容性的安装程序、文档、PyWin32
- 蟒蛇
- 流行的科学模块(例如 numpy、scipy 和 pandas)和
conda
包管理器。 - 天篷
- 带有编辑器和其他开发工具的“综合 Python 分析环境”。
- WinPython
- 带有预构建科学包和用于构建包的工具的 Windows 特定发行版。
请注意,这些包可能不包含最新版本的 Python 或其他库,并且不由核心 Python 团队维护或支持。
4.6. 配置 Python
为了从命令提示符方便地运行 Python,您可以考虑更改 Windows 中的一些默认环境变量。 虽然安装程序提供了一个选项来为您配置 PATH 和 PATHEXT 变量,但这仅适用于单个系统范围的安装。 如果您经常使用多个版本的 Python,请考虑使用 Python Launcher for Windows。
4.6.1. 附注:设置环境变量
Windows 允许在用户级别和系统级别永久配置环境变量,或临时在命令提示符中配置。
要临时设置环境变量,请打开命令提示符并使用 set 命令:
C:\>set PATH=C:\Program Files\Python 3.9;%PATH%
C:\>set PYTHONPATH=%PYTHONPATH%;C:\My_python_lib
C:\>python
这些更改将应用于在该控制台中执行的任何进一步命令,并将被从控制台启动的任何应用程序继承。
在百分号中包含变量名称将扩展到现有值,允许您在开头或结尾添加新值。 修改 PATH
将包含 python.exe 的目录添加到 start 是确保启动正确版本 Python 的常用方法。
要永久修改默认环境变量,单击开始并搜索“编辑环境变量”,或打开系统属性,高级系统设置并单击环境变量按钮。 在此对话框中,您可以添加或修改用户和系统变量。 要更改系统变量,您需要不受限制地访问您的机器(即 管理员权限)。
笔记
Windows 会在 系统变量之后串联用户变量 ,这在修改 PATH
时可能会导致意外结果。
PYTHONPATH 变量被 Python 2 和 Python 3 的所有版本使用,所以你不应该永久配置这个变量,除非它只包含与你安装的所有 Python 版本兼容的代码.
也可以看看
- https://www.microsoft.com/en-us/wdsi/help/folder-variables
- Windows NT 中的环境变量
- https://technet.microsoft.com/en-us/library/cc754250.aspx
- SET 命令,用于临时修改环境变量
- https://technet.microsoft.com/en-us/library/cc755104.aspx
- SETX 命令,用于永久修改环境变量
- https://support.microsoft.com/en-us/help/310519/how-to-manage-environment-variables-in-windows-xp
- 如何在 Windows XP 中管理环境变量
- https://www.chem.gla.ac.uk/~louis/software/faq/q1.html
- 设置环境变量,Louis J. 法鲁贾
4.6.2. 查找 Python 可执行文件
在 3.5 版中更改。
除了为 Python 解释器使用自动创建的开始菜单项外,您可能还想在命令提示符下启动 Python。 安装程序有一个选项可以为您设置。
在安装程序的第一页,可以选择标记为“Add Python to PATH”的选项,让安装程序将安装位置添加到 PATH
。 还添加了 Scripts\
文件夹的位置。 这允许您输入 python 来运行解释器,并输入 pip 来运行包安装程序。 因此,您还可以使用命令行选项执行脚本,请参阅 命令行 文档。
如果您在安装时未启用此选项,您始终可以重新运行安装程序,选择“修改”并启用它。 或者,您可以使用 Excursus: Setting environment variables 中的说明手动修改 PATH
。 您需要设置 PATH
环境变量以包含 Python 安装目录,并以分号与其他条目分隔。 示例变量可能如下所示(假设前两个条目已经存在):
C:\WINDOWS\system32;C:\WINDOWS;C:\Program Files\Python 3.9
4.7. UTF-8 模式
3.7 版中的新功能。
Windows 仍然使用旧编码作为系统编码(ANSI 代码页)。 Python 将它用于文本文件的默认编码(例如 locale.getpreferredencoding())。
这可能会导致问题,因为 UTF-8 广泛用于 Internet 和大多数 Unix 系统,包括 WSL(Linux 的 Windows 子系统)。
您可以使用 Python UTF-8 模式 将默认文本编码更改为 UTF-8。 您可以通过 -X utf8
命令行选项或 PYTHONUTF8=1
环境变量启用 Python UTF-8 模式 。 请参阅 PYTHONUTF8 以了解启用 UTF-8 模式,以及 Excursus: Setting environment variables 了解如何修改环境变量。
当启用 Python UTF-8 模式 时,您仍然可以通过“mbcs”编解码器使用系统编码(ANSI 代码页)。
请注意,将 PYTHONUTF8=1
添加到默认环境变量将影响系统上的所有 Python 3.7+ 应用程序。 如果您有任何依赖于旧系统编码的 Python 3.7+ 应用程序,建议临时设置环境变量或使用 -X utf8
命令行选项。
4.8. 适用于 Windows 的 Python 启动器
3.3 版中的新功能。
适用于 Windows 的 Python 启动器是一个实用程序,可帮助定位和执行不同的 Python 版本。 它允许脚本(或命令行)指示对特定 Python 版本的偏好,并将定位和执行该版本。
与 PATH
变量不同,启动器将正确选择最合适的 Python 版本。 它更喜欢按用户安装而不是系统范围的安装,并按语言版本订购,而不是使用最近安装的版本。
启动器最初在 PEP 397 中指定。
4.8.1. 入门
4.8.1.1. 从命令行
在 3.6 版中更改。
Python 3.3 及更高版本的系统范围安装会将启动器放在 PATH
上。 启动器与 Python 的所有可用版本兼容,因此安装哪个版本无关紧要。 要检查启动器是否可用,请在命令提示符中执行以下命令:
py
您应该会发现您安装的最新版本的 Python 已启动 - 它可以正常退出,并且指定的任何其他命令行参数将直接发送到 Python。
如果您安装了多个版本的 Python(例如 2.7 和 ),您会注意到 Python 已启动 - 要启动 Python 2.7,请尝试以下命令:
py -2.7
如果您想要安装最新版本的 Python 2.x,请尝试以下命令:
py -2
您应该会找到最新版本的 Python 2.x 启动。
如果您看到以下错误,则您没有安装启动器:
'py' is not recognized as an internal or external command,
operable program or batch file.
Python 的每用户安装不会将启动器添加到 PATH
,除非在安装时选择了该选项。
4.8.1.2. 虚拟环境
3.5 版中的新功能。
如果启动器在没有明确的 Python 版本规范的情况下运行,并且虚拟环境(使用标准库 venv 模块或外部 virtualenv
工具创建)处于活动状态,则启动器将运行虚拟环境的解释器而不是全局解释器。 要运行全局解释器,请停用虚拟环境,或明确指定全局 Python 版本。
4.8.1.3. 从脚本
让我们创建一个测试 Python 脚本——创建一个名为 hello.py
的文件,内容如下
#! python
import sys
sys.stdout.write("hello from Python %s\n" % (sys.version,))
从 hello.py 所在的目录,执行命令:
py hello.py
您应该注意到打印了最新 Python 2.x 安装的版本号。 现在尝试将第一行更改为:
#! python3
重新执行命令现在应该打印最新的 Python 3.x 信息。 与上述命令行示例一样,您可以指定更明确的版本限定符。 假设您安装了 Python 2.6,尝试将第一行更改为 #! python2.6
,您应该会找到打印的 2.6 版本信息。
请注意,与交互式使用不同,裸“python”将使用您安装的最新版本的 Python 2.x。 这是为了向后兼容并与 Unix 兼容,其中命令 python
通常指的是 Python 2。
4.8.1.4. 从文件关联
启动器应该已经与 Python 文件相关联(即 .py
、.pyw
、.pyc
文件)。 这意味着当您从 Windows 资源管理器双击这些文件之一时,将使用启动器,因此您可以使用上述相同的工具让脚本指定应使用的版本。
这样做的主要好处是,根据第一行的内容,单个启动器可以同时支持多个 Python 版本。
4.8.2. 社邦线
如果脚本文件的第一行以 #!
开头,则称为“shebang”行。 Linux 和其他类似 Unix 的操作系统对此类行具有本机支持,并且它们通常用于此类系统以指示应如何执行脚本。 此启动器允许在 Windows 上将相同的工具与 Python 脚本一起使用,上面的示例演示了它们的使用。
为了允许 Python 脚本中的 shebang 行在 Unix 和 Windows 之间移植,此启动器支持许多“虚拟”命令来指定要使用的解释器。 支持的虚拟命令有:
/usr/bin/env python
/usr/bin/python
/usr/local/bin/python
python
例如,如果脚本的第一行以
#! /usr/bin/python
将定位并使用默认的 Python。 由于许多编写在 Unix 上工作的 Python 脚本已经有这一行,你应该发现这些脚本可以被启动器使用而无需修改。 如果您正在 Windows 上编写一个新脚本,希望在 Unix 上有用,您应该使用以 /usr
开头的 shebang 行之一。
上述任何虚拟命令都可以以显式版本(或者只是主要版本,或者主要和次要版本)作为后缀。 此外,可以通过在次要版本后添加“-32”来请求 32 位版本。 IE /usr/bin/python2.7-32
将要求使用 32 位 python 2.7。
3.7 版新功能: 从 python 启动器 3.7 开始,可以通过“-64”后缀请求 64 位版本。 此外,可以指定主要和架构而没有次要(即 /usr/bin/python3-64
)。
Shebang 线的 /usr/bin/env
形式还有一个特殊的性质。 在查找已安装的 Python 解释器之前,此表单将在可执行文件 PATH
中搜索 Python 可执行文件。 这对应于 Unix env
程序的行为,该程序执行 PATH
搜索。
4.8.3. shebang 行中的参数
shebang 行还可以指定要传递给 Python 解释器的其他选项。 例如,如果您有一条 shebang 线:
#! /usr/bin/python -v
然后 Python 将使用 -v
选项启动
4.8.4. 定制
4.8.4.1. 通过 INI 文件定制
启动器会在当前用户的“应用程序数据”目录(即 通过使用 CSIDL_LOCAL_APPDATA
) 和 py.ini
在与启动器相同的目录中调用 Windows 函数 SHGetFolderPath
返回的目录。 相同的 .ini 文件用于启动器的“控制台”版本(即 py.exe)和“windows”版本(即 pyw.exe)。
在“应用程序目录”中指定的自定义将优先于可执行文件旁边的自定义,因此可能对启动器旁边的 .ini 文件没有写访问权限的用户可以覆盖该全局 .ini 文件中的命令。
4.8.4.2. 自定义默认 Python 版本
在某些情况下,可以在命令中包含版本限定符,以指示该命令将使用哪个版本的 Python。 版本限定符以主要版本号开头,可以选择后跟句点 ('.') 和次要版本说明符。 此外,可以通过添加“-32”或“-64”来指定是应请求 32 位还是 64 位实现。
例如,#!python
的shebang 行没有版本限定符,而#!python3
有一个仅指定主要版本的版本限定符。
如果在命令中找不到版本限定符,则可以设置环境变量 PY_PYTHON
来指定默认版本限定符。 如果未设置,则默认为“3”。 该变量可以指定可以在命令行上传递的任何值,例如“3”、“3.7”、“3.7-32”或“3.7-64”。 (请注意,“-64”选项仅适用于 Python 3.7 或更高版本附带的启动器。)
如果未找到次要版本限定符,则可以设置环境变量 PY_PYTHON{major}
(其中 {major}
是上述确定的当前主要版本限定符)以指定完整版本。 如果没有找到这样的选项,启动器将枚举已安装的 Python 版本并使用为主要版本找到的最新次要版本,尽管不能保证,这可能是该系列中最近安装的版本。
在安装了相同 (major.minor) Python 版本的 32 位和 64 位实现的 64 位 Windows 上,64 位版本将始终是首选。 这对于启动器的 32 位和 64 位实现都是正确的 - 32 位启动器更愿意执行指定版本的 64 位 Python 安装(如果可用)。 这样就可以预测启动器的行为,只知道 PC 上安装了哪些版本,而不考虑它们的安装顺序(即,不知道 Python 是 32 位还是 64 位版本以及相应的启动器是最后安装)。 如上所述,可以在版本说明符上使用可选的“-32”或“-64”后缀来更改此行为。
例子:
- 如果没有设置相关选项,命令
python
和python2
将使用安装的最新 Python 2.x 版本,命令python3
将使用安装的最新 Python 3.x . - 命令
python3.1
和python2.7
根本不会查询任何选项,因为版本是完全指定的。 - 如果是
PY_PYTHON=3
,命令python
和python3
都将使用最新安装的 Python 3 版本。 - 如果
PY_PYTHON=3.1-32
,命令python
将使用 3.1 的 32 位实现,而命令python3
将使用最新安装的 Python(PY_PYTHON 根本不被视为主要版本已指定。) - 如果
PY_PYTHON=3
和PY_PYTHON3=3.1
,命令python
和python3
都将具体使用 3.1
除了环境变量之外,还可以在启动程序使用的 .INI 文件中配置相同的设置。 INI 文件中的部分称为 [defaults]
并且键名将与环境变量相同,但没有前导 PY_
前缀(并注意 INI 文件中的键名不区分大小写.) 环境变量的内容将覆盖 INI 文件中指定的内容。
例如:
- 设置
PY_PYTHON=3.1
相当于包含以下内容的 INI 文件:
[defaults]
python=3.1
- 设置
PY_PYTHON=3
和PY_PYTHON3=3.1
相当于包含以下内容的 INI 文件:
[defaults]
python=3
python3=3.1
4.8.5. 诊断
如果设置了环境变量 PYLAUNCH_DEBUG
(设置为任何值),则启动器会将诊断信息打印到 stderr(即 到控制台)。 虽然此信息设法同时详细 和 ,但它应该允许您查看 Python 的版本、选择特定版本的原因以及用于执行目标 Python 的确切命令行。
4.9. 寻找模块
Python 通常将其库(以及您的站点包文件夹)存储在安装目录中。 因此,如果您已将 Python 安装到 C:\Python\
,则默认库将位于 C:\Python\Lib\
中,第三方模块应存储在 C:\Python\Lib\site-packages\
中。
要完全覆盖 sys.path,请创建一个与 DLL (python37._pth
) 或可执行文件 (python._pth
) 同名的 ._pth
文件并指定每个路径一行添加到 sys.path。 基于 DLL 名称的文件覆盖基于可执行文件的文件,这允许根据需要限制加载运行时的任何程序的路径。
当文件存在时,忽略所有注册表和环境变量,启用隔离模式,除非文件中的一行指定了import site
,否则不会导入site。 以 #
开头的空白路径和行将被忽略。 每个路径可以是绝对的,也可以是相对于文件位置的。 除了 site
之外的导入语句是不允许的,并且不能指定任意代码。
请注意,.pth
文件(不带前导下划线)将在指定 import site
时由 site 模块正常处理。
当没有找到 ._pth
文件时,这就是 sys.path 在 Windows 上的填充方式:
- 在开始处添加一个空条目,它对应于当前目录。
- 如果环境变量 PYTHONPATH 存在,如 环境变量 中所述,接下来添加其条目。 请注意,在 Windows 上,此变量中的路径必须用分号分隔,以将它们与驱动器标识符(
C:\
等)中使用的冒号区分开来。 - 可以在注册表中添加额外的“应用程序路径”作为
HKEY_CURRENT_USER
和HKEY_LOCAL_MACHINE
配置单元下的\SOFTWARE\Python\PythonCore{version}\PythonPath
的子项。 以分号分隔的路径字符串作为默认值的子项将导致每个路径都被添加到 sys.path。 (请注意,所有已知的安装程序仅使用 HKLM,因此 HKCU 通常为空。) - 如果设置了环境变量 PYTHONHOME,则假定为“Python Home”。 否则,主 Python 可执行文件的路径用于定位“地标文件”(
Lib\os.py
或pythonXY.zip
)以推断“Python 主页”。 如果找到 Python home,则添加到 sys.path(Lib
、plat-win
等)的相关子目录基于该文件夹。 否则,核心 Python 路径是根据存储在注册表中的 PythonPath 构建的。 - 如果找不到 Python Home,环境中没有指定 PYTHONPATH,也找不到注册表项,则使用带有相对项的默认路径(例如
.\Lib;.\plat-win
等)。
如果在主可执行文件旁边或在可执行文件上一级的目录中发现 pyvenv.cfg
文件,则适用以下变体:
- 如果
home
是绝对路径且未设置 PYTHONHOME,则在推导主位置时使用此路径代替主可执行文件的路径。
这一切的最终结果是:
- 当运行
python.exe
或 Python 主目录(安装版本或直接从 PCbuild 目录)中的任何其他 .exe 时,会推导出核心路径,并忽略注册表中的核心路径。 注册表中的其他“应用程序路径”总是被读取。 - 当 Python 托管在另一个 .exe 中(不同的目录,通过 COM 嵌入等)时,将不会推导出“Python Home”,因此使用来自注册表的核心路径。 注册表中的其他“应用程序路径”总是被读取。
- 如果 Python 找不到它的家并且没有注册表值(冻结的 .exe,一些非常奇怪的安装设置),你会得到一个带有一些默认但相对路径的路径。
对于那些想要将 Python 捆绑到他们的应用程序或发行版中的人,以下建议将防止与其他安装发生冲突:
- 在包含要包含的目录的可执行文件旁边包含一个
._pth
文件。 这将忽略注册表和环境变量中列出的路径,并且还会忽略 site,除非列出了import site
。 - 如果您在自己的可执行文件中加载
python3.dll
或python37.dll
,请在 之前显式调用 Py_SetPath() 或(至少)Py_SetProgramName() ]Py_Initialize()。 - 在从应用程序启动
python.exe
之前,清除和/或覆盖 PYTHONPATH 并设置 PYTHONHOME。 - 如果您不能使用之前的建议(例如,您是一个允许人们直接运行
python.exe
的发行版),请确保地标文件 (Lib\os.py
) 存在于您的安装目录中。 (请注意,在 ZIP 文件中不会检测到它,但会检测到正确命名的 ZIP 文件。)
这些将确保系统范围安装中的文件不会优先于与您的应用程序捆绑在一起的标准库副本。 否则,您的用户可能会在使用您的应用程序时遇到问题。 请注意,第一个建议是最好的,因为其他建议可能仍然容易受到注册表和用户站点包中的非标准路径的影响。
在 3.6 版中更改:
- 添加
._pth
文件支持并从pyvenv.cfg
中删除applocal
选项。- 添加
pythonXX.zip
作为与可执行文件直接相邻时的潜在地标。
自 3.6 版起已弃用:
在
Modules
(不是PythonPath
)下的注册表中指定的模块可以由 importlib.machinery.WindowsRegistryFinder 导入。 此查找器在 3.6.0 及更早版本的 Windows 上启用,但将来可能需要明确添加到 sys.meta_path。
4.10. 附加模块
尽管 Python 的目标是在所有平台之间可移植,但仍有 Windows 独有的功能。 标准库和外部的几个模块和代码片段都可以使用这些功能。
Windows 特定的标准模块记录在 MS Windows 特定服务 中。
4.10.1. pywin32
Mark Hammond 的 PyWin32 模块是一组用于高级 Windows 特定支持的模块。 这包括以下实用程序:
- 组件对象模型 (COM)
- Win32 API 调用
- 注册表
- 事件记录日志
- Microsoft 基础类 (MFC) 用户界面
PythonWin 是 PyWin32 附带的示例 MFC 应用程序。 它是一个带有内置调试器的嵌入式 IDE。
4.10.2. cx_Freeze
cx_Freeze 是一个 distutils 扩展(参见 Extending Distutils),它将 Python 脚本包装成可执行的 Windows 程序(*.exe
文件)。 完成此操作后,无需用户安装 Python 即可分发应用程序。
4.11. 在 Windows 上编译 Python
如果你想自己编译 CPython,你应该做的第一件事就是获取 源代码 。 您可以下载最新版本的源代码,也可以直接获取新的 checkout。
源代码树包含 Microsoft Visual Studio 2015 的构建解决方案和项目文件,Microsoft Visual Studio 2015 是用于构建官方 Python 版本的编译器。 这些文件位于 PCbuild
目录中。
检查 PCbuild/readme.txt
以获取有关构建过程的一般信息。
对于扩展模块,请参阅 在 Windows 上构建 C 和 C++ 扩展 。
也可以看看
- Python + Windows + distutils + SWIG + gcc MinGW
- 或“使用 SWIG 在 C/C++ 中创建 Python 扩展并在 Windows 下使用 MinGW gcc 编译它们”或“使用 distutils 和不使用 Microsoft Visual C++ 安装 Python 扩展”,Sébastien Sauvage,2003
4.12. 其他平台
随着 Python 的不断发展,一些以前支持的平台已经不再支持(由于缺少用户或开发人员)。 检查 PEP 11 以了解所有不受支持的平台的详细信息。
- Windows CE 仍然支持。
- Cygwin 安装程序也提供了安装 Python 解释器的功能(cf. Cygwin 包源、维护者发布)
有关带有预编译安装程序的平台的详细信息,请参阅 Python for Windows。