普通用户下使用sudo命令实现ubuntu 20.04.6 LTS 将python3.8 变更为 python3.10并更新pip

文章目录

  • 普通用户下使用sudo命令实现ubuntu 20.04.6 LTS 将python3.8 变更为 python3.10以及将pip从20.0.2更新为23.3.2
    • Step 1:下载指定版本python3.10.13
      • 方法一:wget下载tgz文件并编译
      • 方法二:apt直接安装
    • Step 2:设置默认版本为python3.10
    • Step 3:修改pip指向
    • Step 4:将pip从20.0.2更新为23.3.2
    • Step 5:更换国内源

普通用户下使用sudo命令实现ubuntu 20.04.6 LTS 将python3.8 变更为 python3.10以及将pip从20.0.2更新为23.3.2

Step 1:下载指定版本python3.10.13

省流版:推荐使用apt进行安装,而不是下载文件进行编译安装

执行:

# 更新sudo
sudo apt update
# 安装PPA需要的软件源
sudo apt install software-properties-common -y
# 添加名为deadsnake的PPA源:
sudo add-apt-repository ppa:deadsnakes/ppa
# 这时候才可以安装python3.10:
sudo apt install python3.10

如果此法出现问题,可以看看后面我下载python的弯路,如果没问题,就可以直接跳转Step 2:设置默认版本为python3.10


方法一:wget下载tgz文件并编译

# 下载编译包
sudo apt-get install zlib1g-dev libbz2-dev libssl-dev libncurses5-dev  libsqlite3-dev libreadline-dev tk-dev libgdbm-dev libdb-dev libpcap-dev xz-utils libexpat1-dev   liblzma-dev libffi-dev  libc6-dev 
sudo wget https://www.python.org/ftp/python/3.10.13/Python-3.10.13.tgz
sudo tar -zxvf Python-3.10.13.tgz 
cd Python-3.10.13
# 修改配置,--prefix=/home/cjh/python3.10为安装路径,缺省即默认安装位置
./configure --prefix=/home/cjh/python3.10
# 编译安装
sudo make
sudo make test  # 只用于测试是否能够安装成功,可省略
sudo make install

但我作为普通用户只分配有1G的RAM,不知道是不是运存不够的原因,进行到sudo make install会卡在

gcc -pthread -c -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall    -std=c99 -Wextra -Wno-unused-result -Wno-unused-parameter -Wno-missing-field-initializers -Werror=implicit-function-declaration -fvisibility=hidden  -I./Include/internal  -I. -I./Include    -DPy_BUILD_CORE -o Objects/bytesobject.o Objects/bytesobject.c

即不能用编译安装的方法

方法二:apt直接安装

一开始我直接使用sudo apt-get install python3.10 ,命令执行成功了并且一定的存储空间也被占用了,但是python3.10不翼而飞,怎么都找不到,ls /usr/bin/python*也没有出现python3.10,只有python3.8,非常奇怪。于是想通过安装Anaconda曲线救国

wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2023.09-0-Linux-x86_64.sh 

可惜会报错:ERROR 403: Forbidden。参考这篇文章,发现因为清华源会拒绝不以 Mozilla 开头或不包含 Wget 的用户代理,于是改为

wget --user-agent="Mozilla" https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2023.09-0-Linux-x86_64.sh

成功解决问题!后续在执行 bash Anaconda3-2023.09-0-Linux-x86_64.sh时,发现卡在conda无法下载
合理怀疑运行内存1G无法支持提取:nss-3.89.1-h6a678d5_0.conda

山重水复疑无路,柳暗花明又一村,参考 这篇文章得知使用apt命令安装时,需要以下完整流程:

# 更新sudo
sudo apt update
# 安装PPA需要的软件源
sudo apt install software-properties-common -y
# 添加名为deadsnake的PPA源:
sudo add-apt-repository ppa:deadsnakes/ppa
# 这时候才可以安装python3.10:
sudo apt install python3.10

合理怀疑之前没更新apt导致下载的python3.10不翼而飞

Step 2:设置默认版本为python3.10

无需省流:执行以下命令

# 提高python3.10的优先级
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1
sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 2
# 检查优先级是否设置成功,按回车即可退出
update-alternatives --config python3

Step 3:修改pip指向

无需省流

分别执行以下编辑命令,保证第一行是#!/usr/bin/python3即可

sudo vim /usr/bin/pip
sudo vim /usr/bin/pip3

最后执行pip --versionpip3 --version验证以下,结果应该为:

变更pip指向

Step 4:将pip从20.0.2更新为23.3.2

省流版

提供两种方法:

  • 执行以下命令升级pip为最新版,目前最新版为23.3.2:
curl -sS https://bootstrap.pypa.io/get-pip.py | sudo python3.10

万万不要少了sudo,否则会下载在当前用户下

  • 首先从官网另存文件:单击https://bootstrap.pypa.io/get-pip.py,右键单击并在浏览器中选择“另存为”,便可下载到本地。然后使用scp命令将文件get-pip.py传输到服务器上。登陆服务器,打开终端,cd到文件get-pip.py所在目录下,然后执行以下命令:
sudo python3 get-pip.py

两种方法均可卸载老版本的pip并更新为最新版,即出现:

Successfully uninstalled pip-20.0.2
Successfully installed pip 23.3.2

然后两种方法均需执行以下命令,注意文件名apt_pkg.cpython-38-x86_64-linux-gnu.so很有可能在其他机器上为apt_pkg.cpython-38m-x86_64-linux-gnu.so,请见机行事

# 进入包文件目录
cd /usr/lib/python3/dist-packages/ 
# 重建软连接
sudo cp apt_pkg.cpython-38-x86_64-linux-gnu.so  apt_pkg.cpython-310-x86_64-linux-gnu.so
sudo ln -s apt_pkg.cpython-310-x86_64-linux-gnu.so apt_pkg.so

最后两种方法均需执行以下命令:

sudo vim /usr/bin/pip

将文件中的pip==20.0.2替换为pip==23.3.2,即可:
final

如果以上步骤均可正常运行,那么恭喜你已经更新完成啦!

如果想要更换pip为国内源,请跳转Step 5:更换国内源

如果中途出现下载过慢,或者报类似下面的错误:

ImportError: cannot import name 'html5lib' from 'pip._vendor' 
(/usr/lib/python3/dist-packages/pip/_vendor/__init__.py)
No module named 'apt_pkg'
curl: (35) OpenSSL SSL_connect: 连接被对方重设 
in connection to raw.githubusercontent.com:443
curl: (6) Couldn't resolve host 'xxxx'

可接着看我的心路历程,希望能有所帮助!


当我想要执行pip install beautifulsoup4==4.12.2时,报错

ImportError: cannot import name 'html5lib' from 'pip._vendor' 
(/usr/lib/python3/dist-packages/pip/_vendor/__init__.py)

参考这篇文章,得知此错误会发生于版本过时的pip,最常见于使用 Python v3.10的 Ubuntu 机器上,完美契合当前处境,于是需要升级pip,本想偷懒直接运行python -m pip install --upgrade pip时,结果报相同错误:

报错

一怒之下直接pip install html5lib,结果会报错No module named 'apt_pkg',参考网上频繁出现的解决方案,如:这篇文章

# 进入包文件目录
cd /usr/lib/python3/dist-packages/ 
# 重建软连接
sudo cp apt_pkg.cpython-38-x86_64-linux-gnu.so  apt_pkg.cpython-310-x86_64-linux-gnu.so
sudo ln -s apt_pkg.cpython-310-x86_64-linux-gnu.so apt_pkg.so

不过错误还是没有解决,报的错也没有改变(但谁知道上面的修改是不是后面成功的必经之路呢)

于是私以为更新版本太老的pip v20.0.2不能直接使用python -m pip install --upgrade pip

刚开始使用curl -sS https://bootstrap.pypa.io/get-pip.py | python3.10命令,但不止为何运行实在太慢,甚至会出现:

curl: (35) OpenSSL SSL_connect: 连接被对方重设 
in connection to raw.githubusercontent.com:443
curl: (6) Couldn't resolve host 'xxxx'

的问题。无奈只能从本机上访问https://bootstrap.pypa.io/get-pip.py并尝试下载,但是直接点击此网站并不能直接下载,因为行数很多手动复制也不现实,兜兜转转找了好几个帖子才发现可以右键鼠标,点击另存为即可保存get-pip.py文件,然后再通过scp命令发送文件到服务器上。

然后在服务器保存get-pip.py文件的目录下运行:

python3 get-pip.py

在下载pip-23.3.2-py3-none-any.whl文件时,因为国外网站访问速度贼慢,所以很大可能会中断报错,我找了好久也没找到国内的此文件镜像,或许可能存在于github上,我最后多尝试了几次,最后下载成功了:

天机

不过很奇怪的是,明明成功安装pip-23.3.2,但pip --version依旧是pip 20.0.2,在网上找了很久,搜索更新pip,出来的结果都是pip更新其他的包,无奈之下只能回过头来看上图的提示信息,突然发现这个WARNING已经告诉了一切:pip下载到了当前用户下,而并未加入到PATH路径,同时还发现执行python3 get-pip.py的结果和这篇帖子不同:

root@66b6f8945ca1:/# python get-pip.py
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting pip
  Downloading https://pypi.tuna.tsinghua.edu.cn/packages/c2/d7/90f34cb0d83a6c5631cf71dfe64cc1054598c843a92b400e55675cc2ac37/pip-18.1-p
y2.py3-none-any.whl (1.3MB)
    100% |████████████████████████████████| 1.3MB 1.8MB/s
Installing collected packages: pip
  Found existing installation: pip 18.1
    Uninstalling pip-18.1:
      Successfully uninstalled pip-18.1
Successfully installed pip-18.1

我的执行过程居然没有Successfully uninstalled pip-20.0.2,既然没有执行,那我自己执行能不能行?

但是直接运行pip uninstallpip3 uninstall

居然又会报出:

ImportError: cannot import name 'html5lib' from 'pip._vendor' 
(/usr/lib/python3/dist-packages/pip/_vendor/__init__.py)

的错误。

本以为苍天无眼,但脑子灵光乍现,前面的WARNING说了pip下载到了当前用户下,那么我将其安装到高级用户上何如?执行:

sudo python3 get-pip.py

没错!救赎之道就在其中!它运行正常,成功卸载了pip v20.0.2并安装了pip v23.3.2

不过在执行pip -version时,会有一个错误是说/usr/bin/pip文件中的参数不对,于是:

sudo vim /usr/bin/pip

,将原本的pip==20.0.2替换为pip==23.3.2,即可:
final
到此,pip已经升级完毕,库也能用pip install命令正常安装啦!

Step 5:更换国内源

sudo mkdir ~/.pip
sudo vim ~/.pip/pip.conf

修改如下:

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host = https://pypi.tuna.tsinghua.edu.cn