在 Ubuntu 下从源码编译安装 Python 并解决一些依赖问题。
其实遇到的问题主要也就是依赖问腿。
编译与安装
- 下载源码包:
打开Python Distribution,在里面选择版本然后下载源码包,这里以3.10.12
版本为例。1
| wget https://www.python.org/ftp/python/3.10.12/Python-3.10.12.tgz
|
- 安装必要依赖:
1 2
| apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev \ libssl-dev libreadline-dev libffi-dev -y
|
- 解压源码包:
1 2
| tar -zxvf Python-3.10.12.tgz cd Python-3.10.12/
|
- 启用编译优化
1
| ./configure --enable-optimizations
|
- 编译与安装
1 2
| make -j20 make altinstall
|
其中线程数(-j
)需要根据实际情况调整,一般来说该值等于CPU核心数。 - 测试
测试一下看一下是否正确安装有返回版本号即为正确安装
创建别名与解决问题
创建别名后主要遇到的问题是Ubuntu中默认会自带一个Python供apt等系统程序使用,这里我们变更了版本之后或是不兼容或是指向性不明确总之系统程序无法再正确调用Python,思路也很简单要么把别名变更回去,要么修改系统程序的脚本文件头,修改为原来的版本。
创建别名
- 首先看一下是否存在之前的配置:
1
| update-alternatives --config python3
|
这里执行后应该是返回update-alternatives: error: no alternatives for python3
。 - 找一下二进制文件安装位置返回中寻找路径
1
| python3: /usr/bin/python3 /usr/bin/python3.8 /usr/lib/python3.9 /usr/lib/python3 /usr/lib/python3.8 /etc/python3 /etc/python3.8 /usr/local/bin/python3.10-config /usr/local/bin/python3.10 /usr/local/lib/python3.10 /usr/local/lib/python3.8 /usr/share/python3 /usr/share/man/man1/python3.1.gz
|
这里就是/usr/local/bin/python3.10
。 - 安装别名
1 2
| update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.10 3 update-alternatives --install /usr/bin/python python /usr/local/bin/python3.10 3
|
此时可以输入python -V
和python3 -V
查看是否能正常返回版本号 - 用同样的方法寻找pip的二进制文件安装位置,然后添加别名:
1 2
| update-alternatives --install /usr/bin/pip pip /usr/local/bin/pip3.10 3 update-alternatives --install /usr/bin/pip3 pip3 /usr/local/bin/pip3.10 3
|
此时可以输入pip -V
和pip3 -V
查看是否能正常返回版本号
问题解决
添加完别名后使用apt安装程序,这个时候可能会报错:
1 2 3 4 5 6 7 8 9 10 11 12
| root@machine:/usr/lib/python3/dist-packages Hit:1 http://mirrors4.tuna.tsinghua.edu.cn/ubuntu focal InRelease Hit:2 http://mirrors4.tuna.tsinghua.edu.cn/ubuntu focal-updates InRelease Hit:3 http://mirrors4.tuna.tsinghua.edu.cn/ubuntu focal-backports InRelease Hit:4 http://mirrors4.tuna.tsinghua.edu.cn/ubuntu focal-security InRelease Traceback (most recent call last): File "/usr/lib/cnf-update-db", line 8, in <module> from CommandNotFound.db.creator import DbCreator ModuleNotFoundError: No module named 'CommandNotFound' Reading package lists... Done E: Problem executing scripts APT::Update::Post-Invoke-Success 'if /usr/bin/test -w /var/lib/command-not-found/ -a -e /usr/lib/cnf-update-db; then /usr/lib/cnf-update-db > /dev/null; fi' E: Sub-process returned an error code
|
打开第七行中的脚本即/usr/lib/cnf-update-db
,可以看到该脚本的文件头是以#!/usr/bin/python3
开头的,给他改成#!/usr/bin/python3.8
即可。
1 2 3 4 5 6 7
|
import glob import logging import os import sys ...
|
之后再遇见类似问题均如此解决即可。另外顺带提一句,我这里是Ubuntu 20.04,其他版本自带的Python版本可能不一样,建议提前看好。