蛇皮操作?

把下面这个简单的python脚本保存到桌面,然后双击运行看看:

#!/usr/bin/env python3
import sys,os
print(sys.version)
print(os.getcwd())
input()

说不定你会发现出来的结果是个C:\windows\system32
是不是很没道理?
经过反复的测试,得到的结论是:

只有Python launcher(命令行中的py)能解决问题
具体条件呢,非常奇特
当已安装Python launcher,且py是默认打开方式时
直接双击.py文件(不包括右键打开方式选择py)的情况下
上面的脚本可以正确获取到当前目录(脚本存放的地方)
当py已安装而不是默认打开方式,得到的是C:\Windows\system32
而py未安装时是C:\Windows
Windows,很神奇吧

但是这里又牵扯出两个问题来
如果用官网的安装包安装,并且提权安装给了所有用户
那么相应的PATH条目是写到了系统PATH的顶部
而臭名昭著的假Python——那个会打开应用商店的快捷方式
却是位于用户PATH,优先级更高
如果不手工调整的话,安装的Python无法被正常调用

如果从微软商店安装,倒是能成功覆盖掉假Python的快捷方式
没覆盖的话自查一下应用执行别名的设置
但是,商店版却不附带Python launcher
换言之双击运行.py脚本时工作目录总是错的
这大概就是大家平时感觉到的“商店版Python有毛病”的来历了
不过好在其实是有地方可以单独安装Python launcher的
https://www.python.org/ftp/python/{version}/{architecture}/launcher.msi
version的话看一下python3 -V给出的准确版本号
arch正常是amd64,其他架构懂的都懂
安装之后看看py -0是否能正常找到所有已安装的python版本

万一有缺的话,想想是不是曾卸载过商店版的Python
因为,因为它真的绝绝子
根据PEP 514,已安装的Python会在注册表中的HKEY_CURRENT_USER\Software\Python\PythonCore内注册一个自身版本的项
py是完全只根据这里来找的
而商店版python在执行卸载时会直接把整个PythonCore砍了
导致py找不到当时已安装的其他版本Python
如果没有备份的话,只能通过重装受影响的Python来恢复
惊不惊喜,意不意外

以上,条件都摸清楚了,具体怎么实践就请自由发挥
偷偷再骂一句
macOS上的Python Launcher是废的,根本不能双击运行.py文件

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注