2. 安装Python

本章讲解如何在鲁班猫板卡上安装Python环境。

重要

教程一般基于Python 3.8.10版本(镜像系统是Ubuntu20.04)进行实验及讲解。

2.1. 关于Python版本

鲁班猫镜像是基于Debian、Ubuntu等Linux发行版本,这些发行版本默认都附带了python,一般附带python2*较旧的版本和python3*较新的版本, 可使用如下命令查看默认安装的版本(ubuntu20.04):

# 查看python3版本
cat@lubancat:~$ python3 --version
Python 3.8.10

# 查看python版本
cat@lubancat:~$ python2 --version
Python 2.7.18

# 查看pip3版本
cat@lubancat:~$ pip3 --version
pip 20.0.2 from /usr/lib/python3/dist-packages/pip (python 3.8)

提示

Debian10镜像默认安装的是python3.7.3;Debian11是python3.9.2

2.2. 安装python、pip

鲁班猫系统镜像基于Debian、Ubuntu等Linux发行版本,默认已经安装了python,如果没有安装可以使用apt命令安装和更新:

# 确认连接网络,第一次使用apt需要更新
sudo apt update
# 安装python3(默认系统已经安装可以不执行)
sudo apt -y install python3
# 安装pip工具
sudo apt -y install python3-pip
# 升级pip工具
python3 -m pip install --upgrade pip
# 配置pip源(清华源)
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

如果需要其他版本的python,Ubuntu系统可以使用PPA(个人软件包存档), PPA允许应用程序开发人员和Linux用户创建自己的软件仓库来分发软件,通过PPA可以轻松地获得更加新的软件版本或获得官方Ubuntu仓库以外的软件, 但需要注意这些软件的不稳定和安全性等。

下面我们测试在鲁班猫ubuntu20.04系统上使用 deadsnakes团队 维护的PPA, 添加该PPA后安装最新版本的Python及附加模块。

# 添加PPA,需要回车确认
sudo add-apt-repository ppa:deadsnakes/ppa

# 更新更新下apt缓存
sudo apt update

回车后确认添加,会更新下apt缓存,在输出信息中我们可以看到支持的列表:

Supported Ubuntu and Python Versions
====================================

- Ubuntu 20.04 (focal) Python3.5 - Python3.7, Python3.9 - Python3.13
- Ubuntu 22.04 (jammy) Python3.7 - Python3.9, Python3.11 - Python3.13
- Ubuntu 24.04 (noble) Python3.7 - Python3.11, Python3.13
- Note: Python2.7 (focal, jammy), Python 3.8 (focal), Python 3.10 (jammy), Python3.12 (noble)
are not provided by deadsnakes as upstream ubuntu provides those packages.

Why some packages aren't built:
- Note: for focal, older python versions require libssl<1.1 so they are not currently built
- Note: for jammy and noble, older python versions requre libssl<3 so they are not currently built
- If you need these, reach out to asottile to set up a private ppa

以上信息也可以到 deadsnakes 查看。

然后测试安装指定版本python:

# 安装python3.13
sudo apt install python3.13

# 检测版本
python3.13 --version
Python 3.13.0b2

# 安装其他附加模块(可选)
sudo apt install python3.13-full

# 或者单独安装python相关包(可选)
sudo apt install python3.13-dev python3.13-venv

最后,python安装还可以去官网下载 python源码包 ,然后自行编译安装。

2.3. python、pip的默认版本切换

2.3.1. 手动创建链接

可以注意到上面命令中python3、pip3都带了版本号,主要是由于python的历史原因, 这样使用能更好地与python2区分开来,而python2目前已经停止维护了,我们不建议大家继续使用。 使用我们提供的镜像默认是安装了python2和python3,可以设置当前系统默认的使用版本。

通过以下命令可以设置python、pip命令默认使用python3(可选):

#设置软链接,python默认使用python3
sudo ln -sf /usr/bin/python3 /usr/bin/python

#设置软链接,pip默认使用pip3
sudo ln -sf /usr/bin/pip3 /usr/bin/pip

设置后即可直接使用python或pip命令,检查当前系统python版本(可选):

#查看python路径
cat@lubancat:~$ which python
/usr/bin/python

# 查看python版本
cat@lubancat:~$ python --version
Python 3.8.10

# 查看pip版本
cat@lubancat:~$ pip --version
pip 20.0.2 from /usr/lib/python3/dist-packages/pip (python 3.8)

为了更明确地区分版本,本书后面依然直接使用python3或pip3命令进行说明。

2.3.2. 使用update-alternatives

update-alternatives是专门维护系统命令链接符的工具, 通过update-alternatives命令修改连接指向不同的实际程序或者动态库,实现多版本共存,动态切换的效果。

添加python方案链接,以前面安装了python3.13和python3.8的鲁班猫ubuntu20.04系统为例:

# 创建一个python方案链接,添加python3.13和python3.8,最后一个数字是优先级,数值越大,优先级越高
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.13 1
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.8 2

查看可选python版本,输入对应可选数字设置默认的python版本,这里测试设置python3.13为默认版本:

# 查看当前的python版本
cat@lubancat:~$ python --version
Python 3.8.10

# 然后列出系统上已安装的所有Python配置可选版本,这里重新设置python3.13为默认版本:
cat@lubancat:~$ sudo update-alternatives --config python
There are 2 choices for the alternative python (providing /usr/bin/python).

Selection    Path                 Priority   Status
------------------------------------------------------------
* 0            /usr/bin/python3.8    2         auto mode
  1            /usr/bin/python3.13   1         manual mode
  2            /usr/bin/python3.8    2         manual mode
Press <enter> to keep the current choice[*], or type selection number: 1
update-alternatives: using /usr/bin/python3.13 to provide /usr/bin/python (python) in manual mode

# 查看重新设置后的python
cat@lubancat:~$ sudo update-alternatives --query python
Name: python
Link: /usr/bin/python
Status: manual
Best: /usr/bin/python3.8
Value: /usr/bin/python3.13

Alternative: /usr/bin/python3.13
Priority: 1

Alternative: /usr/bin/python3.8
Priority: 2

# 重新设置python版本后,查看版本
cat@lubancat:~$ python --version
Python 3.13.0b2

如果不需要update-alternatives管理python,删除请使用命令:

# 删除单个python链接
sudo update-alternatives --remove python /usr/bin/python3.13

# 删除所有python方案链接
sudo update-alternatives --remove-all python

2.4. 软件库安装方法

2.4.1. pip下载加速

在后面使用Python时,可能会需要使用pip工具下载安装依赖软件包,而官方下载站 pypi 在国内的访问较慢, 参考如下网页说明设置镜像网站: Pypi 镜像使用帮助

例如,使用pip安装软件包adafruit-circuitpython-ssd1306:

# 使用apt安装python的adafruit-circuitpython-ssd1306包
sudo pip3 install adafruit-circuitpython-ssd1306

# 使用pip list查看安装的包
pip3 list | grep adafruit-circuitpython-ssd1306

# 使用pip uninstall 卸载包
sudo pip3 uninstall adafruit-circuitpython-ssd1306

2.4.2. 用apt代替pip安装软件包

使用pip工具安装软件包时,通常是在本机中进行编译的,部分鲁班猫板卡的性能不高导致编译时间非常长, 还可能因为缺少某些库文件而安装失败。

所以在使用性能不高的板卡安装依赖包时,我们建议先直接搜索一下是否能使用apt工具安装, 它会从软件库中下载预先编译好的软件包,安装时间基本只取决于网络速度。 需要安装更新版本或者apt找不到的包时才使用pip安装。

例如,python常用的numpy数据科学库,如下使用如下apt命令安装,很快就完成了:

# 使用apt安装python的numpy包
sudo apt -y install python3-numpy

至于其它具体软件包在apt工具中的名字,可以在网络中搜索 “apt 安装XXX(如numpy)” 之类的内容, 如果你使用的是debian系统,在debian的软件列表库中查找关键字如 “numpy” :查找debian官方软件包

2.4.3. 用setuptools工具安装软件包

在有些情况下,我们用户需要使用到的一些Python库包。由于一些原因, 我们只获取到了这些库包的源码。那么我们用pip工具或者apt工具就没有办法去安装了。

这时我们可以使用python的setuptools工具,来通过库包源码进行Python库包的安装。

setuptools工具安装方法如下:

# 在终端中输入如下命令:
sudo apt -y install python3-setuptools

下面我们来使用一下setuptools工具。

以Python下的jieba(结巴)库为例,该库可以用于中文分词,是Github一个非常热门的开源Python项目。

其Github仓库为: jieba

我们可以从其仓库拉取源码或者下载其Releases压缩包并安装。

源码目录如下:

broken

进入源码目录,使用setuptools工具通过源码安装库:

#拉取源码
git clone https://github.com/fxsjy/jieba.git

# 进入jieba/目录,在终端中输入如下命令:
sudo python3 setup.py install

等待软件包安装完成即可。

输入下面命令,可以看到,jieba库已经可以正常使用了,分词效果如下:

#登录系统终端,输入python3或者ipython,进入python交互模式,然后使用命令:
import jieba
set_list = jieba.cut("欢迎来到野火Python实践教程", cut_all=False)
print("Default Mode:" + "/".join(set_list))
broken