尝试在Windows 10上运行Python时出现“权限被拒绝”错误。

211
似乎Windows 10的一次更新破坏了Python。仅仅尝试运行python --version就返回“拒绝访问”的错误。三个更新中的任何一个(KB4507453、KB4506991或KB4509096)都不像是罪魁祸首,但问题发生的时间很可疑。我希望有一个更简单的修复方法而不是去尝试回滚。
Python文件的权限为"-rwxr-xr-x",除了安装昨晚的补丁后允许Windows更新重启机器,我没有做任何其他更改。
根据系统信息,我运行的是10.0.18362。
还应该注意到,无论我是否使用“以管理员身份运行”从git-bash尝试执行Python,都会出现这种情况,如果我尝试使用PowerShell,它只会打开Windows商店,好像未安装该应用程序,因此我认为它无法看到我的 /c/Users/david/AppData/Local/Microsoft/WindowsApps/文件夹的内容。
我也尝试重新安装Python 3.7.4,但那也没有帮助。我应该再看些什么?

顺便提一下,“Python上的权限为'-rwxr-xr-x'”在Windows中可能没有意义。这是由类Unix环境(如MSYS2或git-bash)报告的虚假信息。 - Eryk Sun
不是的。这是来自python.org的Python软件包。它已经工作了多年,没有任何问题,但最近的Windows补丁导致了一些问题。 - notanumber
你找到解决方案了吗?我也遇到了同样的问题。 - Shanks
很遗憾,不行。我大部分的工作都在Docker中完成,所以我一直忍受着这个问题。如果我有了发现,我会确保发布出来! - notanumber
谢谢!如果我弄清楚了,我会在这里放一个。 - Shanks
显示剩余2条评论
20个回答

341
据我所知,这是由于最近添加到Windows商店的Python 3.7版本发生冲突引起的。看起来这添加了两个名为python.exe和python3.exe的“存根”到%USERPROFILE%\AppData\Local\Microsoft\WindowsApps文件夹中,在我的情况下,这是在PATH中现有Python可执行文件条目之前插入的。
将此条目移动到正确的Python文件夹之后部分地纠正了该问题。
纠正它的第二部分是在Windows搜索提示符中键入manage app execution aliases并完全禁用Python商店版本。

manage app execution aliases

可能你只需要做第二部分,但在我的系统上,我做了两个更改,现在一切都恢复正常了。


79
我是微软员工和CPython核心开发者。你只需要做第二部分就可以了。升级应用程序后重置别名的相关错误已经修复,将在下一个稳定更新中发布,因此到那时应该只需要进行一次修复。当你获取Insiders更新时,可能需要再做几次。 - Zooba
13
“Access Denied”问题是Git Bash的一个bug(或者说是维护他们的Bash端口的人的问题,我自己也不确定)。启动商店是一个新功能,旨在帮助人们安装Python - 如果您已经使用常规安装程序将其添加到PATH中,则它应优先于新的重定向器,但如果没有,您可以按上面所述禁用它。 - Zooba
5
我只需要做第二部分就能为自己解决这个问题。 - kennyB
9
对于我来说,我还需要将Python添加到我的路径中(C:\Users\YourUsernameHere\AppData\Local\Programs\Python\Python37),这样Git Bash才能找到Python。 - Niels
2
将它添加到我的路径并将其移动到顶部是我的解决方案,就像Neils所做的那样。 我无法仅重命名Windows商店存根,这事实相当恼人。 - John W. Clark
显示剩余11条评论

36

研究

%USERPROFILE%\AppData\Local\Microsoft\WindowsApps中的所有文件都是占位符,指向实际位于C:\Program Files\WindowsApps某个位置的文件,这个位置完全被拒绝了权限。

看起来我在这个问题的重复声明中说得对:

"似乎他们没有真正考虑到分发方法会影响权限!"

来源: 无法在Windows Store的Git Bash上安装pylint

由于Windows应用程序分发方法的原因,权限被彻底搞砸了:

enter image description here enter image description here enter image description here 有趣的是,它说"Users"组可以读取和执行文件,我的特定用户也可以,但管理员组只能以一些令人难以理解的方式列出文件夹内容。当试图在文件资源管理器中访问文件夹时,它甚至拒绝显示文件夹内容,所以还有一些可疑的地方。

有趣的是,尽管在CMD中执行python可以正常工作,但“WindowsApps”文件夹在列出所在目录的文件时不会显示出来,并且尝试进入该文件夹会生成“权限被拒绝”的错误:

enter image description here

尝试更改权限需要先更改所有者,因此我将所有者更改为管理员组。之后,我尝试更改管理员组的权限以包括完全控制,但无法更改,因为“访问被拒绝”(嗯,微软,这正是我们想要更改的!)。

enter image description here

这个权限错误发生在很多文件上,我使用Alt+C快速点击“继续”按钮来重复处理信息,但这仍然花费了太长时间,所以我取消了该过程,导致出现此警告消息:

enter image description here

现在我无法将TrustedInstaller用户重新设置为WindowsApps文件夹的所有者,因为它不会出现在用户/组/内置安全原则/其他对象列表中。*

enter image description here

*实际上,根据这篇教程,你可以通过在对象名称文本框中输入NT Service\TrustedInstaller来将所有者切换回TrustedInstaller。

解决方案

没有解决方案。基本上,我们完全被搞砸了。微软真是个高级的举动。


15
我是微软员工和CPython核心开发者。目前我正在解决Windows上的一个bug,即只有在启用全局别名(在“管理应用程序执行别名”中)的情况下,才能在此位置启动可执行文件。我正在努力改变这种情况,使得用户只需要安装当前用户的应用程序即可。 - Zooba
4
我们可以通过此对话框读取权限,因为它是由一个dllhost.exe实例所拥有(承载安全壳扩展rshx32.dll),该实例以管理员访问权限运行,因此具有“列出文件夹内容”访问权限(即执行、同步和读取数据、属性和权限)。用户组的条目不是用于正常访问检查。它是有条件的,取决于WIN://SYSAPPID安全属性的存在,即任何应用程序。每个应用程序的子文件夹授予用户读取访问权限,但执行访问取决于通过设置自定义访问令牌的应用链接运行。 - Eryk Sun
@ErykSun 这是我见过的第一个关于Windows执行和权限的明智回答。谢谢。 - Ryan
1
@MarkSimpson很高兴这个帖子有所帮助。我不确定自己写了什么。一定要感谢在这里发表真正答案的Microsoft员工。 - Ryan
1
这个 bug 似乎在一年后仍然存在... 据我所知,让 GitBash、Python 和 Windows 10 共同工作仍然是一条死路。 - worc
显示剩余2条评论

27

1
我在bash中运行Python时确实遇到了这个问题,但是在PowerShell中没有 - 但我不认为你提供的链接中的错误是问题所在。更有可能是这个:https://github.com/msys2/Msys2-packages/issues/1943 - Matthew
问题在于,微软没有权利发明新的操作系统功能,因为那些不会成为标准,这只有Linux/POSIX才能做到。所以MSYS2,向他们致敬,因为他们忍受了所有微软的压力,我相信他们也会解决这个问题,但这不是他们的错,而是微软的错。 - Dave Ankin

21

这个问题实在是太普遍了,而且大多数答案和说明都无法解决它。以下是在Windows 10上的操作步骤:

  1. 在开始菜单中搜索并打开编辑系统环境变量

  2. 点击环境变量...

  3. 在系统变量部分,找到键为Path的变量并双击它。

  4. 查找指向Python文件的路径,可能没有。如果有,请选择并删除它们。

  5. 创建一个新的变量,并将其设置为指向你的Python可执行文件的路径。通常情况下,它是C:\ Users \ [YOUR USERNAME HERE] \ AppData \ Local \ Programs \ Python \ Python38。通过文件浏览器检查以确保这一点。

    注意:如果你看不到AppData,那是因为你还没有启用查看隐藏项:点击“查看”选项卡并选中“隐藏项目”复选框。

  6. 创建另一个变量,指向Scripts目录。通常是C:\ Users \ [YOUR USERNAME HERE] \ AppData \ Local \ Programs \ Python \ Scripts

  7. 重新启动你的终端并尝试输入 pypythonpython3python.exe


安装了Anaconda的用户怎么办?我已经按照每个步骤进行了操作,系统变量指向我的Python安装目录也已存在,但问题仍然存在。 - Martin

20

简单回答:将 python 替换为 PY,所有内容都会按预期工作。


那么这是在 Py 3.9.4 中实现的新功能? - dawn
5
请问PY是什么?能否提供更多背景信息? - secavfr
1
适用于我,不确定为什么。 - Frank Guo

16

解决方法:如果您是通过exe安装的Python,请按照以下步骤操作。

步骤1:卸载Python。

步骤2:安装Python,并勾选如下截图中突出显示的Python路径复选框(黄色)。

这样可以解决我的问题。

enter image description here


我在安装Python之后才做到这一点 - 最初它没有被安装,因此出现了错误 :) - Jono
那么你应该已经看到了安装错误。 - Shakeel
1
这是正确的做法!谢谢! - Frank Guo

9
将本地Python路径添加到WindowsApps之前,问题得到了解决。 环境变量 > Path Bash Python --Version

这真的起作用了,就像是什么鬼的情况。笑 :D - Biskrem Muhammad

8

如果有人想使用Microsoft Store版本的Python,并且已经进行了相关“管理应用程序执行别名”的修复(由@Zooba完成),并且正在使用Git for Windows git-bash(也称为msys2 mintty中的BASH),那么解决方案很简单,只需记住使用winpty即可。

winpty python3

然而,如果系统安装了其他版本的Python,请确保已将这些副本移除(例如从python.org安装的副本),或者仅限于它们特定的捆绑应用程序中(例如OSGeo4W)(可能需要重新排序环境变量)。
为什么会出现权限错误,如果忘记了使用winpty?第一次运行时,Microsoft Store的存根与msys可用的权限冲突。许多其他答案详细介绍了正在发生的事情以及为什么感觉奇怪。简短的回答是,存根试图成为通往Microsoft Store的便捷方式。如果您使用winpty启动它,则可以做到这一点。之后,它继续需要winpty,原因与Microsoft Store相关和不相关。

有其他答案建议使用 winpty,但他们的推理与此无关、错误或过时。我认为一个更新的2021年摘要可能会有用。 - Kevin

6

虽然 PowerShell 不是解决方法,但我遇到了和 MINGW64 类似的问题。我通过切换到 Linux 的 Windows Subsystem(我本来就想这样做)作为终端,解决了这个问题,包括在 VSCode 中。以下文章描述的很好:

如何配置 VS Code(Windows)以使用 Ubuntu 应用程序作为终端

总结:

1)从 Windows 应用商店安装 Ubuntu

2)将默认 bash 更改为 CMD -> wslconfig /setdefault Ubuntu

--- 对于 VSCode

3) 重新启动 VSCode

4) 在 VSCode 中将“terminal.integrated.shell.windows”更改为“C:\WINDOWS\System32\bash.exe”(有关详细信息,请参见上面的文章)

现在在 VSCode 和 WSL(Bash on Ubuntu on Windows)中顺畅运行。这可能至少是你的一个临时解决方案。


5

对于我来说,我尝试使用管理应用程序执行别名,但出现错误提示"python3不是一个命令",因此我使用py代替python3,这样就可以正常运行。

我不知道为什么会出现这种情况,但对我来说这样可行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接