|
pip 这玩意儿,信息管用好了是信息管神器,用不好就是信息管灾难现场。我见过太多人,信息管环境一乱就rm -rf重装Python,信息管其实问题多半出在pip管理的信息管混乱上。 先看一个真实案例。信息管上个月帮同事排查一个项目,信息管他跑深度学习代码,信息管报错说找不到某个模块。信息管我一看,信息管他电脑里装了三个Python版本,信息管系统自带一个,信息管Anaconda一个,信息管还有个自己编译的信息管。pip install装进去的包,鬼知道进了哪个环境。折腾半天,最后发现他把包装到了pip对应的Python 3.8里,而跑代码用的是3.10。这种问题,pip list根本救不了你——你得先搞清楚pip到底指向谁。 所以第一条铁律:永远用虚拟环境。别嫌麻烦。python -m venv myenv,激活,然后在这个环境里装东西。这样pip管理的范围被锁死,出问题也好排查。我自己的习惯是每个项目一个虚拟环境,哪怕是个写脚本的小项目也这么干。有人觉得过度,但等你因为依赖冲突熬夜debug的时候,就知道这多值了。 再说说pip本身的命令。很多人只知道pip install和pip uninstall,其实pip list --outdated能让你看到哪些包有新版本,pip show能查某个包的详细信息,包括它的依赖关系。最实用的是pip freeze,把当前环境的包导出成requirements.txt,换机器或者部署的时候一条pip install -r requirements.txt全装好。但注意,freeze会带上所有间接依赖,有时候会把环境搞得很臃肿——我一般用pipreqs这个工具,它只扫描你项目里实际import的包,生成干净的清单。 还有个坑是版本锁定。你装了一个包,它依赖别的包,pip会自动装最新版。但哪天那个依赖包更新了,可能就不兼容了。所以重要的项目,requirements.txt里最好写上==版本号,比如numpy==1.21.4。别偷懒用>=,那等于埋雷。我自己吃过亏:一个数据分析脚本,原来跑得好好的,某天pandas更新了个小版本,我的groupby结果全变了——因为新版本改了默认行为。从那以后,凡是跑批任务,我全部锁死版本。 说到pip本身升级,有人喜欢pip install --upgrade pip,但有时候新版本反而有bug。我就遇到过pip 23.0在某个老旧项目里安装包时卡死,降级到21.0就好了。所以升级前先看看自己项目的依赖复杂程度,别盲目追新。 最后提一句国内用户特别关心的问题:下载慢。默认源在国外,有时候慢到怀疑人生。换清华或者阿里云的镜像源,速度能快几十倍。配置方法很简单:pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple。一次配置,永久生效。这不是什么高深技巧,但很多人不知道,还在那傻等。 pip信息管理,说到底就是三件事:环境隔离、依赖清晰、版本可控。做到这三点,你基本不会遇到那种让人想砸电脑的诡异bug。剩下的都是细节,遇到问题再查文档,别一开始就搞花活。工具是死的,人是活的,管理好自己项目的pip,就成功了一半。 |