在 Debian Linux 编译安装 Python 3
本文记录了从源代码编译安装 Python3.9.6 的流程和在安装途中遇到的一些问题的解决方法。
安装 Python
从 Python 官方网站 下载源码,本文以 Python 3.9.6 版本为例。Linux 版本的 Python 只有源代码,不能直接下载可执行文件。下载并解压缩文件:
wget https://www.python.org/ftp/python/3.9.6/Python-3.9.6.tar.xz
tar xvf Python-3.9.6.tar.xz
在编译之前, 可能 需要执行这个命令来安装依赖:
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev libffi-dev liblzma-dev
进入目录,进行编译,然后安装:
./configure --enable-optimizations --enable-shared
make -j8
sudo make altinstall
make -j8
是指用八个线程编译,请根据自己的电脑配置(CPU核心数量)去设定。同时注意不是 make install
是 make altinstall
,具体可以查看 [2]。
至此,Python 的编译安装过程已经结束,如果没有意外,在终端输入 Python3.9 即可运行刚刚安装好的 Python。
如果想要 python3 默认运行 python 3.9.6,可以更改 python3 的符号链接。首先看看 python3 实际是什么:
ls -l `which python3`
lrwxrwxrwx 1 root root 24 Aug 7 14:35 /usr/bin/python3 -> python3.6
一般情况下,它是一个符号连接,指向了 python3.6。想要默认运行 Python3.9 只要改变这个符号连接即可:
sudo rm /usr/bin/python3 # 删除现有的符号链接
sudo ln -s /usr/local/bin/python3.9 /usr/bin/python3
一些意外
重新安装
安装之后不小心把 Python 搞坏了(ln -sf 搞反了……),怎么卸载掉重新安装?查了一下,make 脚本并没有提供一个自动化删除刚刚安装好的文件的程序,所以只能自己一个个删。删掉 [2] 中的表格里提供的那些目录即可,还有一些显而易见的 so 文件也删掉。
然后再次 make altinstall 。
找不到 libpython3.9
有可能会有这个报错:
/usr/local/bin/python3.9: error while loading shared libraries: libpython3.9.so.1.0: cannot open shared object file: No such file or directory
这其实就是 Windows 用户可能会遇到的“找不到动态链接库”。Linux 的动态链接库查找依靠两个机制,一个是 ldconfig,另一个是 LD_LIBRARY_PATH 环境变量。
在网上找到的其他文章可能会让你去改 LD_LIBRARY_PATH ,但是其实不需要那么麻烦。我们直接从 ldconfig 入手,查看 /etc/ld.so.conf.d/
这个目录里的文件,有没有文件的内容里存在一行 /usr/local/lib
(一般在 libc.conf)里有。如果有的话,那么其实配置是没问题的,可以执行 ls /usr/local/lib
,在输出的结果中应该可以看到有 libpython3.9.so.1.0
这个文件。
所以我们直接执行 sudo ldconfig
命令来更新一下 ld cache 即可。执行完毕之后再执行 python3 ,我们刚刚安装的 Python 应该就能正常运行了。
pip 有问题
安装后可能会发现 pip 用不了。于是尝试安装 pip [3]:
wget https://bootstrap.pypa.io/get-pip.py
sudo python3.9 get-pip.py
然后报错说 lsb_release
找不到,pip 安装失败。执行 cat `which lsb_release`
发现这个脚本引入了 lsb_release 这个包。
lsb_release 存在于 debian 系统提供的 python 模块的目录中,具体位置是 /usr/lib/python3/dist-packages
。从 APT 中安装的 python 的 lib 目录( /usr/lib/python3.5/
)中的 site.py 经过了定制,会自动把 dist-packages 加入到 sys.path
中,使得系统提供的 python 解释器能供找到系统提供的模块。只要我们让自己安装的 python 解释器也能找到这个 dist-packages 目录,就能解决这个问题。
查看 [4] 或者 site.py 文件的注释,发现我们可以在 site-packages 目录中加入 .pth 文件来将自定义的目录加入到 sys.path
中。执行命令:
sudo nano /usr/local/lib/python3.9/site-packages/dist-packages.pth
文件的内容输入:
/usr/lib/python3/dist-packages
然后再执行上面的安装 pip 的命令,即可成功安装 pip。