pyenv 是一个非常好用的 python 版本管理工具,可以很方便的在工作环境中安装、管理和切换不同版本的 python。
使用命令 pyenv install <version>
可以安装指定版本的 python,但是在安装 python 过程中,发现很容易出错,比如下载失败,找不到某些依赖包之类的,后来看了一些文章,包括官方的一些文档,对这些个问题有了一些经验,在这里做一下总结。
本文主要针对的是 Mac os 系统,已经安装了 Homebrew 包管理器,其它系统也可以借鉴。
问题一、下载缓慢甚至失败
使用 pyenv 安装 python 时,默认从 python.org
下载指定版本,往往特别慢,经常下载失败,这时可以先从官网下载所需要的版本的源代码到 ~/.pyenv/cache
目录下,再执行安装命令(亲测很好用)。
注意这里要下载的是类似于 Python-3.7.3.tar.xz
这样的压缩文件,要到官网 sourcecode 页面 才可以下载。
问题二、提示错误,找不到某些依赖包
出现这样的错误有两种情况,一是有些依赖包没有安装,二是依赖包安装了,但是安装 python 时,链接器没有找到依赖包。
第一种情况,安装 python 前需要先安装所需的依赖包。
对 Mac os 系统而言,如果没有安装 Xcode 命令行工具,需要先安装:
xcode-select --install
另外,还需要安装以下 5 个依赖包:
brew install openssl readline sqlite3 xz zlib
可以先通过 brew list
命令查看是否已经安装过某些依赖包,只需要安装缺少的依赖包就可以了(这里默认安装了Mac os 的 Homebrew 包管理器)。
对于 10.14 以上的系统而言,还需要安装额外的软件开发工具包(sdk),具体请查看文档Requirements,有的已经安装过了,就不需要重复安装了(其它操作系统也可以查看 Requirements 获取帮助)。
第二种情况,即使所需的依赖包已经全都安装好了,在安装 python 时也可能会出错,原因是安装时链接器找不到所需要的依赖包,就会认为相关的依赖包没有安装,给出错误提示。
比如提示 zlib
没有安装,那么可以在安装 python 时,在安装命令前添加几个参数,如下:
CFLAGS="-I$(brew --prefix zlib)/include" \
LDFLAGS="-L$(brew --prefix zlib)/lib" \
pyenv install -v <version>
上面的安装命令中,
-v
选项显示安装时的细节,
CPPFLAGS
是 c 和 c++ 编译器的选项,这里指定了 zlib
头文件的位置,
LDFLAGS
是 gcc 等编译器会用到的一些优化参数,这里是指定了 zlib
库文件的位置,
$(brew --prefix zlib)
这一部分的意思是在终端里执行括号里的命令,显示 zlib
的安装路径,可以事先执行括号里的命令,用返回的结果替换 $(brew --prefix zlib)
,效果是一样的,
每一行行尾的反斜杠可以使换行时先不执行命令,而是把这三行内容当作一条命令执行,
如果有多个依赖包都找不到,可以在引号里继续添加其它依赖包的信息,如:
CFLAGS="-I$(brew --prefix zlib)/include -I$(brew --prefix sqlite3)/include" \
LDFLAGS="-L$(brew --prefix zlib)/lib -L$(brew --prefix sqlite3)/lib" \
pyenv install -v <version>
在安装命令前加上这两个参数后,链接器就可以找到相应的依赖包,可以成功安装。
具体可以参考文档 Common build problems。