博文

目前显示的是 二月, 2021的博文

clash for windows 系统代理时 pip 出现 ProxyError 的情况分析记录

22/04/02 Update: 有一位朋友在留言中问了下面的问题: > cfw中启用Specify Protocol或者pac对访问https网站依旧无效 于是我又打开阔别已久的 Windows 开发机看了一下(顺便一提,果子也挺烂的,尤其是ARM版的,不过看在字体渲染的份上还是先用果子吧): 问题在于 Clash for Windows 的Specify Protocol处理其实还是有问题,如果你之前没有仔细完全阅读下面那个设定代理服务器的函数,翻下去看一下它,就在倒数第二张图。 可以看到如果只是单纯地把注册表项的内容由 `127.0.0.1:7890`改为`http://127.0.0.1:7890`的话,urllib只会返回一个只有一个key也就是`http`的代理dict。 这时候从pip的请求调用链往上找,可以看到负责决定使用这个dict中哪个代理的代码是 `requests/utils.py`的`select_proxy`函数: ![](https://vip1.loli.io/2022/04/02/fj2DLqrsTV1ludp.png) 因为红框中的部分的限制,当你请求`https://pypi.org`的时候,只有key为`https`/`https://pypi.org`/`all`/`all://pypi.org`的代理会被使用,上面那个`http`的代理自然也就不会被使用。 BTW,因为这个代码是 requests 库的,这也就意味着在 Windows 平台上 Clash for Windows 的系统代理不会影响到大部分py应用的http请求。 而正确的做法是什么呢?让我们在IE中设置上代理,然后看一看它给出的行为: ![](https://vip1.loli.io/2022/04/02/HbkhtyWvcsKGeNR.png) ![](https://vip2.loli.io/2022/04/02/AZR7aDWN9wFxyT2.png) 同时,因为 urllib 中还存在代理的类型推测代码,所以正确的设置应该是: `http=http://127.0.0.1:7890;https=http://127.0.0.1:7891` 21/06/07 Update: CFW [解决了](https:/