核心问题是要解决Django版本和Python版本匹配问题。版本间兼容关系如下,详细可以看这里。
Django version | Python versions |
---|---|
2.2 | 3.5, 3.6, 3.7, 3.8 (added in 2.2.8), 3.9 (added in 2.2.17) |
3.1 | 3.6, 3.7, 3.8, 3.9 (added in 3.1.3) |
3.2 | 3.6, 3.7, 3.8, 3.9 |
从以上可知,如果要安装最新的Django3.2,那Python版本必须要3.6以上。而现在手上的树莓派3B里的Python是3.4,所以必须要先升级。
升级方法都要涉及到Python的编译,具体如下。
sudo apt update
sudo apt install build-essential libsqlite3-dev sqlite3 bzip2 libbz2-dev #安装依赖库
wget https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tar.xz
tar zxvf Python-3.7.3.tar.xz
cd Python-3.7.3
sudo ./configure
sudo make -j4 #多核心编译
sudo make altinstall #不替换原版本
rm -rf /usr/bin/python3
sudo ln -s /usr/local/bin/python3.7 /usr/bin/python3 #修改默认Python3
rm -rf /usr/bin/pip3
sudo ln -s /usr/local/bin/pip3.7 /usr/bin/pip3 ##修改默认Pip3
安装完成后,当运行 python3 manage.py runserver 8000后,出现错误提示,
Watching for file changes with StatReloader
Exception in thread django-main-thread:
Traceback (most recent call last):
File "/usr/local/python3/lib/python3.7/threading.py", line 917, in _bootstrap_inner
self.run()
....
最终提示找不到sqlite3,无法import
当时考虑这里有两个问题,一个是需要安装sqlite3,另一个对于Exception,查了网上的说法和Django版本有关,需要降级。但实际查了官网的版本对应关系后,Python3.7是完全没有问题的。所以检查没有尝试降级的做法,先是考虑安装sqlite3。
关于sqlite安装,网上的做法是要下载编译sqlite,然后再次编译Python,看上去很繁琐。同时在Django的安装文档里也看到sqlite是在Python里应该已经自带,所以提出问题,为什么刚才的安装里没包含呢?后来对比了多个树莓派Python的升级方法中,对于依赖库的安装,有些是带了sqlite,有些是没带,而我一开始用的恰好是没带的方法。然后,马上尝试单独追加安装依赖,并重新编译Python,在做auto configure的时候,应该会找到sqlite并把它包含编译进去。
sudo apt install libsqlite3-dev sqlite3
安装完成后,在Python3下,import sqlite3可以验证是否安装成功。还可以这样验证: find / -name _sqlite*.so,是否能在Python3.7下找到so文件。
说明一下,上面的依赖库安装已经是包含sqlite3了。
好,现在再次运行, python3 manage.py runserver 8000 一切正常了。