2. pip基础使用:安装、卸载、升级包,以及list与freeze的区别

好,咱们正式开始聊pip。说实话,pip这东西太基础了,基础到很多人用了好几年都没仔细琢磨过。我见过不少同事,装包只会pip install xxx,卸载就靠猜。嗯,今天咱们把它彻底捋一遍。

2.1 安装包:不只是pip install

最基础的安装命令,大家都会:

pip install requests

但实际项目中,我强烈建议你指定版本号。为什么?因为不指定版本,今天装的是1.0,明天可能就是2.0了。我曾经在一个项目里吃过这个亏——同事的机器上装了个新版库,接口变了,代码直接崩了。

所以,我个人的习惯是:

pip install requests==2.28.1

如果你想要某个范围内的版本,也可以这样:

pip install "requests>=2.20, <3.0"

还有几个常用选项,我列一下:

选项 说明 示例
-U 升级到最新版 pip install -U requests
--user 安装到用户目录(不需要sudo) pip install --user requests
-i 指定镜像源(国内必备) pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests
-r 从requirements文件安装 pip install -r requirements.txt
小技巧:国内用户建议配置默认镜像源。我一般用清华的源,速度快且稳定。配置方法:pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

2.2 卸载包:干净利落

卸载命令很简单:

pip uninstall requests

但这里有个坑——pip默认会问你是否确认删除。如果你在脚本里批量卸载,记得加个-y参数:

pip uninstall requests -y

我曾经在CI脚本里忘了加-y,结果构建卡在那等人工确认……嗯,那次之后我就长记性了。

注意:卸载包时,pip不会自动删除依赖。如果你卸载了一个被其他包依赖的库,可能会出问题。建议用pip show 包名先看看依赖关系。

2.3 升级包:保持新鲜度

升级单个包:

pip install --upgrade requests

或者简写:

pip install -U requests

升级pip本身:

pip install --upgrade pip

这里说个我踩过的坑。有一次我升级了某个核心库,结果项目里三个模块同时报错。后来我养成了一个习惯——升级前先看看changelog,或者先在测试环境试一下。

2.4 pip list vs pip freeze:到底有啥区别?

这个问题我面试时经常问。很多人答不上来,或者觉得差不多。其实区别很明显。

pip list:显示当前环境中所有已安装的包,包括pip本身、setuptools这些基础工具。

$ pip list
Package            Version
------------------ ---------
certifi            2022.12.7
charset-normalizer 3.1.0
idna               3.4
pip                23.0.1
requests           2.28.1
setuptools         67.6.0
urllib3            1.26.15

pip freeze:只显示你用pip install安装的包,而且输出格式可以直接扔进requirements.txt。

$ pip freeze
certifi==2022.12.7
charset-normalizer==3.1.0
idna==3.4
requests==2.28.1
urllib3==1.26.15

看出来了吗?pip freeze不会输出pip和setuptools。而且它的输出格式是包名==版本号,可以直接拿来用。

我个人的习惯是:

  • 查看环境里装了啥,用pip list
  • 生成依赖文件,用pip freeze > requirements.txt
重点:千万别用pip list的输出直接当requirements.txt!格式不对,而且会带上你不需要的基础包。

2.5 实战:用pip freeze管理项目依赖

假设你接手了一个项目,第一件事就是生成依赖文件:

pip freeze > requirements.txt

然后别人拿到项目,直接:

pip install -r requirements.txt

这样所有人的环境就一致了。我在团队里推行这个做法后,再也没出现过「我机器上能跑啊」这种鬼话。

不过要注意一点——pip freeze会输出当前环境所有的包。如果你在虚拟环境里用,那没问题。但如果你在全局环境里用,可能会把一堆不相干的包也列进去。所以,我建议每个项目都用虚拟环境。

2.6 常用命令速查表

命令 作用
pip install 包名 安装包
pip uninstall 包名 卸载包
pip list 列出所有包
pip freeze 列出项目依赖包
pip show 包名 查看包详情
pip search 关键词 搜索包(已废弃,建议去PyPI网站搜)
pip check 检查依赖冲突
我的建议:没事多用pip check扫一下环境。我每周都会跑一次,看看有没有依赖冲突。早发现早解决,别等到上线前才炸。

好了,pip的基础操作就这些。说白了,日常开发中80%的时间你只会用到install、freeze和list这三个命令。但把这几个用熟了,能省不少事。下一章咱们聊聊虚拟环境,那才是真正让pip发挥威力的地方。