在 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 installmake 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。

引用

  1. https://unix.stackexchange.com/a/332658
  2. https://docs.python.org/3/using/unix.html#building-python
  3. https://stackoverflow.com/a/44622410
  4. https://docs.python.org/3/library/site.html

此条目发表在Misc分类目录,贴了, , , , 标签。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据