本文介绍一例由Windows的“应用执行别名”引起的环境变量冲突。

一、问题场景

  上个月给Surface重装了一次操作系统。因为之前Python安装在非系统盘,安装后的程序文件都还在,所以阿猪不打算去Python官网下载Windows Installer进行重新安装,而是继续使用原来留下来的程序文件。

  打开CMD,将当前路径切换到之前安装Python的根目录,然后运行python.exe,可以正常显示Python的信息,说明Python是正常的。按理说,只需要手工编辑环境变量,为path这个变量新建一条记录,写入Python的路径就可以正常使用了。

  但是偏偏出了幺蛾子,不起作用。一些靠环境变量来寻找Python的脑残程序提示未安装Python,在CMD中直接运行python命令会跳转到Windows应用商店的Python下载页面。

二、原因

  经过一番研究,最终发现罪魁祸首是Windows的“应用执行别名”。按照阿猪的理解,它相当于一个专门针对Windows应用(即Windows应用商店版的程序)的“环境变量”或者“快捷方式”管理程序。

  在Windows左下角的“运行”或者“搜索”框中输入`管理应用执行别名`并按下回车键,就可以打开“管理应用执行别名”的界面,我们可以看到有两行分别是“python.exe”和“python3.exe”,并且处于开启状态。当处于开启状态时,Windows就会向`%USERPROFILE%\AppData\Local\Microsoft\WindowsApps`这个目录添加一个相同名字的文件,它的作用相当于一个快捷方式。

  在Windows环境变量的path这个变量中,%USERPROFILE%\AppData\Local\Microsoft\WindowsApps这条记录默认是在第一行的位置。所以我们当在CMD中运行python命令后,Windows会最先查看这个目录中是否存在python.exe这个文件。这就导致Windows看到管理应用执行别名创建的python.exe文件后,就会运行这个文件,并且终止继续在path变量的其他路径中寻找。

  当使用Python官网的Windows Installer或者从Windows应用商店安装Python时,管理应用执行别名可以正确识别出Python已经安装,运行python命令后可以正常启动Python。但是阿猪重装操作系统后,管理应用执行别名就会认为这台电脑还没有安装Python,并且打开Windows应用商店的Python下载页面。

三、解决方法

1、方法1:在“应用执行别名”中的关闭Python的别名设置

  直接在“管理应用执行别名”中关闭与Python有关的两个选项。这样Windows就会从%USERPROFILE%\AppData\Local\Microsoft\WindowsApps目录中删除同名的文件,从而可以确保可以继续在path变量的其他路径中寻找python.exe

2、方法2:修改环境变量中的顺序
将Python路径的那条记录向上移动到%USERPROFILE%\AppData\Local\Microsoft\WindowsApps这条记录之上。
道理是一样的,直接让Windows最先查找正确的路径,找到python.exe后自然就不会与%USERPROFILE%\AppData\Local\Microsoft\WindowsApps发生冲突了。