2021年5月21日,最新的 Sublime Text 4 上线了,升级后却有点糟心,原本开箱即用的 Python 被优化出了各种小毛病。
花了点时间一一修复,解决方法总结如下。
一、Python 无法运行([WinError 2] 系统找不到指定的文件)
[WinError 2] The system cannot find the file specified.
[cmd: ['py', '-u', 'C:\\Users\\Hsin\\Desktop\\test.py']]
[dir: C:\Users\Hsin\Desktop]
[path: xxx]
[Finished]
如果电脑中安装的是非官方的 Python 环境,在Ctrl+B
运行Python程序的时候可能会遇到以上情况。
如,我的 Python 环境是 Miniconda(包括 Anaconda 也会有同样的问题,后面详细说),隔壁这位老哥的环境是 ArcGIS Pro,都不能成功运行。
问题来源于 Sublime Text 更新了调用 Python 的命令行指令:旧版本中调用的命令为python
,而在新版中改为了py
。
(Sublime 的报错提示)
(Sublime 的 Python 配置文件)
py
是个啥玩意儿?原来是 PEP 397 中提出的 Windows 特供版 Python Launcher,可以根据脚本开头的 shebang lines 自动切换该脚本的 Python 运行环境(比如自动切换 Python 2 还是 Python 3)。
看起来这个改进挺不错的,但是问题在于,前面说的那些第三方 Python 环境砍掉了这个功能,conda 的环境中根本没有py.exe
这个文件,就导致了py
命令无法被识别而报错。
解决方案
在 Python 的安装目录下,找到python.exe
,复制到另一个地方,改名为py.exe
,再拖回 Python 的安装目录。
注意,不要直接在根目录下新建python.exe
的快捷方式然后改名,因为这样得到的文件全名其实是py.exe.lnk
。
以上方法其实是把原有的 Python 解释器给换了个皮,所以也不要用它去尝试 PEP 397 中给出的功能,当作一般的 Python 解释器去用就好了。
我也在 Sublime Forum 报告了以上问题,详情见此。
二、Matplotlib 画图无法弹窗
这个问题还是由 Sublime 的命令行指令变更引起的。原本的命令行中的shell_cmd
被修改为了cmd
,禁止了管道和重定向功能,导致 Matplotlib 以及依赖 Matplotlib 的相关库(比如 Pandas)的画图功能都无法正常实现,运行代码会无法弹出画图窗口。
解决方案
我尝试过把配置文件的cmd
都改回shell_cmd
,但是还有问题,原因不明。
目前的解决方案是在 Sublime 的 Python 配置文件中添加一行"shell": true
:
- 打开 Sublime Text 根目录下的
Packages
文件夹; - 找到
Python.sublime-package
,并用压缩软件打开(如 360 压缩); - 用文本文件的方式打开压缩包里面的
Python.sublime-build
文件,在最后添加"shell": true
; - 将更改保存在压缩文件中并退出。
最后你的Python.sublime-build
应该是这样的:
{
"cmd": ["python3", "-u", "$file"],
"file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
"selector": "source.python",
"env": {"PYTHONIOENCODING": "utf-8"},
"windows": {
"cmd": ["py", "-u", "$file"],
},
"variants":
[
{
"name": "Syntax Check",
"cmd": ["python3", "-m", "py_compile", "$file"],
"windows": {
"cmd": ["py", "-m", "py_compile", "$file"],
}
}
],
"shell": true // 这里是添加的内容
}
需要注意的是,"shell": true
的用法已经被 deprecated,在目前仍然可以使用,但是在将来的版本中可能会出现新的问题。
有关这个问题我也提交了一个 pull request,可供参考。