为什么在Windows上安装了两个独特的Python 3.7.0副本,位置截然不同?



我在Windows上安装了Python 3.7.0。我只关注了安装程序一次,但我在两个不同的位置安装了两个不同的 python 可执行文件。

C:Windowspy.exe

带有白色图标,887 KB(908,952 字节(;和

C:UsersmyuserAppDataLocalProgramsPythonPython37python.exe

带黑色图标,97.6 KB (99,992 字节(

Python 安装程序指定了第二条路径,如安装指南所示,但 Git Bash、Cygwin 和 MSYS+MingW 都报告第一条路径有效,而不是第二条路径:

$ which python
which: python: unknown command
$ which py
/c/WINDOWS/py.exe

PowerShell显示它们都是Python 3.7.0,尽管它们的文件大小不同:

PS C:UsersmyuserAppDataLocalProgramsPythonPython37> ./python.exe -V
Python 3.7.0
PS C:UsersmyuserAppDataLocalProgramsPythonPython37> py -V
Python 3.7.0

第一个路径没有"脚本"子文件夹,但第二个路径有,但是系统环境变量指向没有"脚本"文件夹的路径上的"脚本"文件夹:

路径变量:%PYTHON_HOME%%PYTHON_HOME%Scripts

PYTHON_HOME变量:C:Windows

那么"py.exe"存储库在哪里呢?为什么它们都能正确运行 python 脚本并具有相同的输出?为什么无论如何都要在C:Windows安装?我必须将第二个物理添加到 PATH 变量中,以便能够在不键入py -m pip的情况下从终端使用pip,并且我不想键入长版本。

py.exe是Windows的特殊Python启动器。它不与任何特定版本的 Python 直接关联,它只是与任何版本的 Python 3.3 或更高版本一起安装,并提供三个主要好处:

  1. 安装在Windows目录中可确保它始终安装在您的PATH中(因此无需为每个 Python 安装目录修改PATH(
  2. 它允许您轻松选择不同的 Python 版本;py -2 myscript.py在您的系统上使用最新的 Python 2 运行它,py -3 myscript.py使用最新的 Python 3 版本运行它,或者即使有更高的版本可用,也可以使用 Python 3.5py -3.5 myscript.py启动。从 3.6 的启动器开始,没有参数,它运行您安装的最新版本的 Python;对于 3.3-3.5 的启动器,它默认运行最新版本的 Python 2,并需要-3开关才能使其使用最新的 Python 3。
  3. 通过将启动器与.py扩展相关联,您可以在脚本中使用 UNIX 样式的 shebang 行。例如,如果脚本的第一行是#!/usr/bin/env python3(非常标准(,并且安装了py.exe并与.py文件相关联,那么在运行myscript.py时,它相当于运行了py -3 myscript.py

您可以阅读有关 PEP 的更多详细信息。

关键是,py.exe实际上并不存储自己的任何库。它所做的只是提供通用接口来查找Windows上其他现有的Python安装(虽然它只附带3.3及更高版本,但它也管理较旧的安装,包括Python 2安装(。不幸的是,pip必须以丑陋的方式运行,但如果你想允许多个版本的 Python 存在于一个系统上而不相互踩踏,这几乎是不可避免的。如果您同时安装了 2.7 和 3.7,则PATH中只有一个可以排在第一位,因此您只能运行一个python.exe和一个pip;通过使用带有py -2 -mpippy -3 -mpippy.exe启动器,您可以精确地使用两个装置相互踩到对方的脚趾。

你能在两个实例中都使用这些命令运行两个版本的 Python 吗:

import sys
print('n'.join(sys.path))

结果是相应 Python 副本的默认库路径。

蟒蛇不使用PYTHONPATH.Python 标准文档建议不要配置此环境变量,因为不同版本的 Python 可能有其兼容的库。所以,我猜不要做任何事情,除非你的磁盘空间用完了。其中一个Python必须由cygwin安装,另一个是由标准的Python安装程序安装的。

最新更新