接上一个帖子
PreToolUse: Read hook error
Failed with non-blocking status code: No stderr output
PostToolUse: Read hook error
Failed with non-blocking status code: No stderr output
UserPromptSubmit hook error
…
根据本机目前成功修复的情况,原因定位和原理非常简单,但其形成和每种方式的处理方法基本不一样 。
相关的GitHub PR确实显示已解决,排除这些的情况下,CSDN的帖子给了一个提示:这个错误和插件的hook的运行方式有关,但至于怎么运行的,运行所需的条件(包括环境、作用域)语焉不详 。而且对照各类*./hook.json文件也没有发现特别明显的配置不对的地方。实在是查不到,所以我问了DS,而这一问我完全没有想到是组织问题 。
1. Python安装
“N老师,不对啊,难道不该想办法在settings.json解决吗?这是忽悠谁?”
前面也有提示,这里需要做一个铺垫,我们先来盘点一下安装Python的方式。
1.1 官网下载安装
这是一般的安装方式,以Ubuntu 24.04系统为例,在下载Python-3.14.7.tgz之后,一般后接的是下面的命令:
1 | tar -xzvf ./Python-3.14.7.tgz -C ......
2 | apt update && apt install ......
3 | ./configure
4 | make
5 | make install -nproc ...... # 我不记得线程数是不是这么写了但是大概是这样
而下载完之后,在安装文件夹下(一般是/usr/local/bin)有若干文件:
python3.14 python3 pip pip3
注意 ,python 和python3 不可能同时拥有,通常做法是建立关键词软链接 (Windows一般叫做创建快捷方式 )达成输入哪个都能进入专用命令行的目的。而问题恰恰就出在这里:
初始化(装机)个人电脑、公用/半公用电脑的时候安装的“教程”有什么一般就做了什么,不会回头检查派生对象或附件有没有问题。
而这就要说出第二种安装方式了。
1.2 专用组件打包安装
这个安装方式确实给了很大方便,但也不自觉地培养了一批不太懂计算机常识 的人,以Anaconda 为代表举例,特别是如果使用Linux发行版的操作系统,一个*.sh文件就能解决所有问题。这样的安装的时候一般也没有python3.exe或python3。
Anaconda
Download Success
Choose Your Download Windows Mac Linux Anaconda Distribution Package and environment management with conda, Anaconda Navigator desktop app, and 600+ packages. Everything you need for data science. Graphical Installer Windows 64-Bit Graphical...
Est. reading time: 3 minutes
Conda从设计之初就是为了解决配置麻烦的问题进行的开发,常规思考方式认为“都搞好了那就不用再回头了”。
上文说到,在第一次配置的时候,由于种种原因,大家都无法一次性配置好目前的配置和以后的预留,特别是以专用组件打包安装的方式兴起之后,关注配置对将来的预留的想法就进一步减少了,甚至都不看python可执行文件在哪个地方。在个人电脑配置之下,专用组件打包安装的方式一出现问题基本就是配置预留问题 。这些包包括但不限于这些:
包(专用组件)
用途
Anaconda
科学计算
Miniconda
科学计算、相关后端
Pixi
理科、工科、部分商科的实验环境构建
1.3 虚拟环境?文件夹!附属品!
可能有的人就要问了,Python既然装哪里都行,要么一个源头安装派生一堆环境,要么现搞一个,不香吗?
我只能说,你说得对,前者是PyCharm的方式(原理是venv),后者是uv的方式。甚至不需要刻意安装Python,比如Node.js的安装就能把C++和CPython都装好。
综上所述,Python的安装目前已经做到基本可以不关注它本身的情况,而这一次出现的问题就是它自己本身。
2. 问题排查
核心:python3=~/AppData/Local/Microsoft/WindowsApps/python3,非交互子进程(TTY)下静默退出49,且零输出 。
光看它看不出来,换一个说法:
在设置python3专用映射之前,输入python3会自动跳转到Microsoft Store,需要安装一个应用 。
这里的问题是,我的Python环境是Node.js安装的附带品,并没有关注到C:/Python314这个文件夹的情况,而且Node.js在安装Python的时候使用的是chocolatey【PEP 397】,类似于uv但不像它,以致C:/Windows/py.exe映射到了C:/Python314/python.exe。
解决方法就是把C:/Windows/py.exe复制一份到了C:/Python314/python3.exe,基本解决了这个问题。而这个出问题的插件含hookify。但是,所谓这个插件出问题也算不上核心问题 。
3. 如果是其它方式?
排查到这里,我刚开始问的是这个:
Windows安装Python的时候,只要不按MS Store装就会出现这个问题?
结果模型给了我一句:所有通过PATH找python3都会踩中,而且报错信息为空,极难排查 。security-guidance插件的sg-python.sh注释里甚至直接写明了这个坑。
简单来说,因为上面几种常规方式不是巨硬想要的,一个“我不要你觉得,我要我觉得”的条件反射就能解释?
好在,虽然WindowsApps占位符在用户PATH第一位,但是因为系统PATH优先,所以它永远排在Python314之后十几位,根据优先级,复制之后完全不会出现无效的问题,事实上也是这样。
那么,只有uv的电脑呢?已知uv安装之后只有uv.exe和核心解释器;只有conda的电脑呢?甚至于说只安装了QGIS(GDAL)运行环境的电脑呢?不是所有的设备在设计资源提供和管理的时候想到这个问题,真的需要特意安装一个或者复制一个才能解决吗?hookify这个插件固然可以删除,但说不准呢?
坦率地说,这个问题一般也不会归为疑难杂症,而是历史问题,现在AI Coding的工具所需要的底层环境比之前相比都复杂了。不信可以对比下MATLAB、Mathematica这些软件所需的环境,几个环境在耦合一起。而且有的软件的前置条件非常多,典型的是llama.cpp:
安装C/C++运行时/开发与执行运行时
安装CUDA驱动
安装CMake
而且有的还说有安装顺序,完全能和“pip安装包都有顺序”这个点相比了。当然这样的问题算是好解决的NP难,前面排查的那个,我确实不好说了(?)