背景
看到不少刚刚开始学习 Python 的同学,都会被推荐使用 Anaconda,很有一种必备 神器 的味道。
也不是说这个东西不好,主要是安装它的时候,它会自动地一股脑儿地的安装很多其它的库,表面上看起来确实省去了以后我们一个个地安装库的麻烦。可是,
你知道这些库的数目是多少么?
出于好奇,我专门打开 官网 看了一眼,大概有 250 个库左右。如果你学习 Python 的目的不是做数据或机器学习相关的事情,即使不考虑占用的磁盘空间,很大一部分库可能你压根儿就不会用到。
你知道这些库会带来什么问题么?
库版本冲突:同一个库有多个版本,不同版本之间存在不兼容的情况。你可能已经看到过类似 Traceback 的异常信息。
有时一个库还需要依赖多个其它的库,遇到版本冲突的可能性会更高。
你什么时候会遇到库版本冲突的问题?
安装新库的时候,如果这个新库的版本,或者这个新库的依赖库的版本和机器已经安装过的某些库版本不一致时,就可能会出现库版本冲突问题。
升级旧库的时候,如果机器已经安装过的某些库对这个旧库有依赖,且不兼容这个旧库的新版本时,就会出现库版本冲突问题。
其它情况类似。
你可以想象一下,不管有用没用,这个 Anaconda 会一口气往机器里塞入几百个库,安装的时候可能感觉很爽,后续持续使用的过程中,遇到库版本冲突的可能性会有多高?而且,这么多库之间的依赖关系可能会很复杂,解决冲突的难度又会有大?
我还是推荐使用 PIP,一个 Python 内置 的库管理工具,通过命令行窗口,使用两三个命令就可以完全搞定。毕竟安装或升级库其实很简单,用什么,安装什么,比较安心!
如果安装 Python 的时候,使用的是官网提供的安装包,安装完成之后,PIP 是可以直接使用的。
列出已安装的库
命令:pip3 list,示例:
pip3 list
Package Version
------------- -------
async-timeout 4.0.2
autopep8 1.6.0
Deprecated 1.2.13
packaging 21.3
pip 22.2.2
pycodestyle 2.8.0
pyparsing 3.0.9
redis 4.3.3
setuptools 63.2.0
toml 0.10.2
wrapt 1.14.1
Package 是库的名称,Version 是库的版本号。
安装库
命令:pip3 install,以安装库 PyMySQL 为例:
pip3 install PyMySQL
Collecting PyMySQL
Downloading PyMySQL-1.0.2-py3-none-any.whl (43 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 43.8/43.8 kB 408.9 kB/s eta 0:00:00
Installing collected packages: PyMySQL
Successfully installed PyMySQL-1.0.2
我们只需要指定库的名称,PIP 会自动帮助我们完成库的下载和安装这个库的最新版本,如:1.0.2。
我们想指定库的版本,应该怎么做呢?
还是使用命令:pip3 install,额外指定一下版本号即可:
pip3 install PyMySQL==1.0.1
Collecting PyMySQL==1.0.1
Downloading PyMySQL-1.0.1-py3-none-any.whl (43 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 43.8/43.8 kB 390.9 kB/s eta 0:00:00
Installing collected packages: PyMySQL
Attempting uninstall: PyMySQL
Found existing installation: PyMySQL 1.0.2
Uninstalling PyMySQL-1.0.2:
Successfully uninstalled PyMySQL-1.0.2
Successfully installed PyMySQL-1.0.1
PIP 会按照我们指定的版本(1.0.1)下载库,安装的时候,如果发现已经存在这个库的其它版本(1.0.2),会先卸载已有的版本(1.0.1)之后,再安装指定的版本(1.0.2)。
我们可以利用这个特性实现库的版本 升级 或 覆盖。
我们怎么知道库的版本有哪些呢?
命令:pip3 index versions:
pip3 index versions PyMySQL
WARNING: pip index is currently an experimental command. It may be removed/changed in a future release without prior warning.
PyMySQL (1.0.2)
Available versions: 1.0.2, 1.0.1, 0.10.1, 0.10.0, 0.9.3, 0.9.2, 0.9.1, 0.9.0, 0.8.1, 0.8.0, 0.7.11, 0.7.10, 0.7.9, 0.7.8, 0.7.7, 0.7.6, 0.7.5, 0.7.4, 0.7.3, 0.7.2, 0.7.1, 0.7.0, 0.6.7, 0.6.6, 0.6.4, 0.6.3, 0.6.2, 0.6.1, 0.6, 0.5, 0.4, 0.3
INSTALLED: 1.0.1
LATEST: 1.0.2
index 是一个实验性质的命令。
对 Python 有一定了解的同学可能知道,Python 的这些库实际都是托管在网站 PyPI上面的,PIP 安装库的时候默认会从这个网站下载库。因为这个网站部署在国外,国内访问的时候可能会遇到网络不通或下载速度过慢的问题,好在国内有不少组织都提供这个网站的镜像服务(源),遇到上述问题的时候,我们可以指定一个镜像地址,这样 PIP 就会从这个镜像地址下载库。
镜像地址是通过参数 i 指定的,以阿里云为例:
pip3 install PyMySQL -i https://mirrors.aliyun.com/pypi/simple/
Looking in indexes: https://mirrors.aliyun.com/pypi/simple/
Collecting PyMySQL
Downloading https://mirrors.aliyun.com/pypi/packages/4f/52/a115fe175028b058df353c5a3d5290b71514a83f67078a6482cff24d6137/PyMySQL-1.0.2-py3-none-any.whl (43 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 43.8/43.8 kB 179.7 kB/s eta 0:00:00
Installing collected packages: PyMySQL
Successfully installed PyMySQL-1.0.2
命令 index 也支持参数 i。
卸载库
命令:pip3 uninstall,以卸载库 PyMySQL 为例:
pip3 uninstall PyMySQL
Found existing installation: PyMySQL 1.0.2
Uninstalling PyMySQL-1.0.2:
Would remove:
/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/PyMySQL-1.0.2.dist-info/*
/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pymysql/*
Proceed (Y/n)? Y
Successfully uninstalled PyMySQL-1.0.2
清空缓存
PIP 会把之前下载过的库缓存到本地,后续再次安装库的时候就可以不再从网络下载,直接使用本地的库。需要清空缓存的时候,可以执行:
pip3 cache purge
结语
好用的工具可以很大程度提升效率。知道工具是做什么的,怎么做的,可以帮助我们更好地使用工具。