python - 为什么 Windows 上安装了两个不同的 Python 3.7.0 副本?

标签 python windows python-3.x python-3.7 path-variables

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

C:\Windows\py.exe

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

C:\Users\myuser\AppData\Local\Programs\Python\Python37\python.exe

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

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

$ which python
which: python: unknown command

$ which py
/c/WINDOWS/py.exe

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

PS C:\Users\myuser\AppData\Local\Programs\Python\Python37> ./python.exe -V
Python 3.7.0

PS C:\Users\myuser\AppData\Local\Programs\Python\Python37> py -V
Python 3.7.0

第一个路径没有“Scripts”子文件夹,但第二个路径有,但是系统环境变量指向没有“Scripts”文件夹的路径中的“Scripts”文件夹:

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

PYTHON_HOME 变量: C:\Windows\

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

最佳答案

py.exe很特别Python launcher for Windows 。它不与任何特定版本的 Python 直接关联,只是与任何版本的 Python 3.3 或更高版本一起安装,并提供三个主要优点:

  1. 正在安装在 Windows目录确保它始终安装在您的 PATH 中(因此无需为每个 Python 安装目录修改 PATH)
  2. 它可以让你轻松选择不同的Python版本; py -2 myscript.py在您的系统上使用最新的 Python 2 运行它,py -3 myscript.py使用最新的 Python 3 版本,或 py -3.5 myscript.py即使有更高版本可用,也可用于通过 Python 3.5 启动。从 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

您可以read more details on the PEP .

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

关于python - 为什么 Windows 上安装了两个不同的 Python 3.7.0 副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52446496/

相关文章:

python - 在有限的尝试游戏中猜猜我的号码

python - 将curl get to Rest api转换为python

python - 通过 dbus 传递大型数据结构

python - 如何修改 Pandas 的 Read_html 用户代理?

c# - 适用于 C# 应用程序的 AnyCPU/x86/x64 及其 C++/CLI 依赖项

windows - 如何在本地的 Tomcat 中运行 Solr 4?

python - 加速将函数作为 numba 参数的函数

python - 使用 Python 和 SQLite3 动态生成 SQL 查询

python - TensorFlow Python 脚本被杀死

c++ - 如何修复 Windows 上的 Qt 控制台输出(使用 `qInstallMsgHandler` 和 `qDebug` )?