1、服务器模型奇妙出现了pip安装任何包、换任何源都连接超时的问题,让人焦头烂额。起初怀疑是服务器访问不了外网,但是ping baidu.com非常正常。然后ping 清华源,豆瓣源等等,发现都ping不通,只有百度能ping通。发现ping其他pip源时返回的提示信息里面的ip地址是ipv6格式的,就很奇怪。
后来上网查发现大多数网站都没有一个稳定使用的ipv6地址,如果以v6的形式去通信,肯定有问题(个人理解)。但是ping百度时默认的是ipv4的地址,很奇怪不知道为什么。于是我怀疑是服务器在访问其他网址时一直用的v6的地址,造成通信不畅。起初怀疑是dns解析错了,但是我拿另外一台正常服务器的网络配置(dns地址等)完全配置给有问题的机器,发现还是不行。即使ip只有最后一位数字不同,dns完全相同,代理地址(学校)完全相同,pip源完全相同,就是不行。
然后我考虑是否能调整v4服务和v6服务的优先级,这个一搜就有,按照教程把v4的优先级提前,结果发现还是不行。然后索性把v6服务完全禁掉,这个随便一搜也有教程,只留v4的服务,没想到,真的成功了。能够ping通除了百度其他的网址,pip安装也似乎正常了。不过似乎v4
和v6服务同时开启时,其中一项网络不通会自动启用另一项,但是之前真的不知道为什么完全不行。
pip能正常安装后,我又重新分别测试了恢复默认的v6网络优先级,和重新启用ipv6服务,结果现在网络也依然是正常的,至今不知道之前网络极端不正常的最关键因素是什么。
2、关于pip换源的问题,在解决上个问题的过程中,也看了很多pip换源的问题,发现有很多种设置。最全面的一个解释是这条博客
三个参数global,site, user,分别代表的具体含义文中也给出了解释:
具体的优先级我没有考证,但这条命令很清晰地列出了所有可以指定pip源的文件以及相应的位置,如果想进行修改非常容易。
3、关于很多时候在虚拟环境中pip默认安装不到当前虚拟环境的问题。
这个问题网上回答超级多,问题很常见,但是大部分回答都没说到点子上,只是治标不治本的一些方法,这儿有个回答说的非常好
总结一下,应该就是不管你当前的路径如何,又是在哪个环境中,pip install xxx命令执行时,其所安装的包总是对应于当前pip版本的。我的理解中,pip版本是对应于python解释器的。
- 不管你创建了多少虚拟环境,如果这些环境并没有指定特殊的python版本,而是基于当前所使用的anaconda的那一个基本的python解释器,那你在任何环境中pip install都会安装首先默认安装到你所使用的anaconda的pckg路径下。但如果你所使用的anaconda所在的并不是你当前账号(非root),也就是说你没权限往人家的账号(anaconda所在账号)写入内容,那pip安装就会退而求其次,在你的当前账号下安装全局pckg(一般可能在~/.local/路径下?)。如果还是这个背景条件下,你使用pip install xxx --user命令,在原来的基础上额外添加了–user,则pip会直接安装在当前账号全局变量包路径下,而不会先去尝试在anaconda所属路径去安装。
- 再说一下当某个虚拟环境的python解释器与默认anaconda不是同一个时,pip installxxx命令会自动在当前python所在的路径去安装。比如在创建该环境时指定了python版本,conda create -n xxx python=xxx,不管这个python版本号是否与anaconda默认的相同,该环境的python解释器都是新创建且隶属于当前账号~/.conda/env/xxx路径下的,所以对应于该环境的pip 默认的安装地址一定也是该环境内。
- 所以,总结来说就是,pip install默认安装的路径一定是与当前python解释器路径一致的。
4、最后一个小坑,就是可能有时候发现我指定了一个新的python解释器创建了一个新环境,但是激活环境后pip 安装的包依旧不在我的虚拟环境目录里面。
这篇文章大概率会解答这个问题
以前我为了图省事,把自己账号的~/.bashrc文件中添加了 账号一登录就conda activate xxxx(我自己常用的环境)的命令,这样就不用再自己手动激活。但是如上面文章所说,这样其实已经嵌套了好几层了。但是无论来回切换嵌套多少层,pip的版本总是对应于最初激活的那个base环境,所以最好的方法就是取消账号登录激活base环境的做法,然后自己手动选择初始激活哪个环境,该终端对应的即为该环境的python解释器对应的那个pip版本,默认的安装地址也即python解释器的相应位置。
另一篇关于修改默认激活环境的文章