嵌入式开发最后需要给开发板配置python 及其各种库,且开发板里有系统自带的 python 2.7 版本,而开发手册建议 python 版本 3.5+,为了避免后续屁事不断的麻烦,决定采用虚拟环境。此博客后续会更新。
1.1 安装 虚拟环境 及 python 3+,命令如下:
sudo apt install virtualenv
sudo apt-get install libpython3.5-dev
sudo apt install python3-tk
virtualenv -p /usr/bin/python3 venv
1.2 安装 python3-dev(因为开发板里有两个版本,所以要指明是 python 3 这个版本。) 依赖库,后面用得上,先装好。
sudo apt install python3-dev
安装下面库之前,先进入虚拟环境:
source venv/bin/activate
你们的路径并不是一定和我一样,到时注意一下。进入虚拟环境后,下面就是在该环境下安装各种库。
1.3 安装 numpy 库。一开始安装出错,想了一会,直觉告诉我应该是相关编译器(gcc,make)没装导致出错,本来想一个个下,发现有个软件包将它们全包含了,参考博客 https://blog.csdn.net/yzpbright/article/details/81515459 。于是,有:
sudo apt-get install build-essential
然后再试一下,pip 一律不要加 sudo ,否则库会安装在 python 2 的版本下,切记!
pip install numpy
1.4 因故第二次安装时,没这么顺利,磕磕碰碰的。当时按我上次经验装好各种库,安装后报错:
Consider using the --user option or check the permissions
上网查解决方法,全部喊我这样写:
pip install --usr numpy
大概上天考验我,还是不行,查了一遍也没什么法子,只能自己瞎搞了。先下好它的安装包,解压到 site-packages 目录下,然后找到 numpy 的 setup.py 文件,运行它
python setup.py install
还是不行,草,后来想他一直在报权限方面的错误,就干脆把 site-packages 目录下的所有文件(包括其自身)的权限都设为 777 ,然后再运行 setup.py 脚本,就开始编译安装,中间过程没看,后来在最后一行发现:
error : Pemission denied : /venv/bin/f2py3.5 # 不知道什么鬼错误
还以为又安装失败,不死心的进入 python 然后 import numpy 一下,竟然没报错,然后又输入几行代码,正常运行!
好吧,有时候瞎搞也是一种宝贵的冒险精神,希望下次运气也这么好吧。
更新:关于这种权限问题,经过多次碰壁后,摸索出解决方案。在装 numpy 之前,把 /venv 目录下四个子目录的权限全设为777,如下:
sudo chmod 777 bin include lib share # 我是在 /venv 目录里操作的,所以是相对路径
1.5 第三次安装 numpy 时,是的我又来了,也遇见了第二次相同问题,权限错误。后来就
sudo pip3.5 install numpy # 还是虚拟环境下,加上 3.5 让系统明白你要装在哪个 python 版本上
这样操作,错倒是没报,只是安装结束后,进 python2.7 、python3.5中 import numpy 都报错没有此模块。想了一下没有头绪时,只有重新安装,因为我是 python3.5 的虚拟环境下,所以可以直接用 pip ,这点注意。
pip install numpy
##然后报错
error : Pemission denied : /venv/bin/f2py3.5
看了一会,试着进入 python3.5 ,然后 import numpy ,发现成功了。
好了,下一个库。
2.1 scipy 库的安装花费时间蛮长的,网上资料太多,光是选择就花了蛮久时间,看完很多经验,采用以下做法。主要参考这位前辈的博客 https://blog.csdn.net/yishengguoke/article/details/79435436 。
注:要安装numpy和scipy,就需要ATLAS —> 要安装ATLAS,就需要安装BLAS和LAPACK 。
# 安装gfortran,后面编译过程中会用到
sudo apt-get install gfortran
# 安装blas,Ubuntu下对应的是libopenblas,其它操作系统可能需要安装其它版本的blas——这是个OS相关的。
sudo apt-get install libopenblas-dev
# 安装lapack,Ubuntu下对应的是liblapack-dev,和OS相关。
sudo apt-get install liblapack-dev
# 安装atlas,Ubuntu下对应的是libatlas-base-dev,和OS相关。
sudo apt-get install libatlas-base-dev
然后,输入命令:
pip install scipy
在 “building wheel for scipy” 这挣扎了好久,还是成功安装,心累。
说句题外话,一开始参考网上的这个方法:
sudo apt install python3-scipy
虽然成功安装,但进入 python 3 ,在交互模式下输入 import scipy ,发现报错:没有该模块。所以后来又卸载了它。
sudo apt remove python3-scipy
所以,这个方法你们看着用。
不出意外,安装 Piilow 库时也报错,基本都是依赖库的原因,万恶的依赖库。上网查资料,这位仁兄的很靠谱 https://blog.csdn.net/sinat_21302587/article/details/54631597 ,操作如下:
sudo apt-get build-dep python-imaging # 注意不是 sudo apt-get install build-dep python-imaging
一开始以为作者少了个 install ,自作主张给它加上去了,结果打脸了,所以同志们要相信别人啊。200多M下完执行:
pip install Pillow # 和上面一样,虚拟环境下下载,不要加 sudo
成功安装,这个折腾少点,希望接下来能够顺一点。
参考博客:https://blog.csdn.net/lingyun_csdn/article/details/79921750 。
我的输入如下:
pip install cython # 再次提醒,注意是虚拟环境,不要加 sudo 。
sudo apt-get install libhdf5-dev # PyPI里没有它,用 apt 下载 。
pip install h5py
发现好几个库安装时都会在 " building wheel for xxxx" 卡一会。不过还是成功了,下一个坑,继续 。
这个库是搞得最久的一个库了,可能它比较新,网上的经验也不多,不过找了几天还是找到一篇,我大体是参考他的
https://www.cnblogs.com/jourluohua/p/10235317.html 。个人操作如下:
一开始安装 protobuf 库,这个它在 PyPI 上很多衍生版本,一开始下的时候也挑花眼,最后看资料才明白,单纯下 protobuf 就好:
pip install protobuf
毫无疑问,肯定安装失败,又找了会资料,下了这个库:
pip install pytest
pip install pybind11 # 此外,numpy 与 scipy 也是需要提前下好。.
下了后,还是不行,一直报错与 protobuf 有关,找了会资料,下了它们:
sudo apt-get install libprotobuf-dev protobuf-compiler
最后,试了下
pip install onnx
好了,成功安装,该死的依赖库。
① 体会
opencv 库是我花了最久的一个库了,不知道是不是系统原因,直接 pip install opencv-python 会显示找不到该库。上 pypi 下载 whl 包安装,调用时会报错 ‘ No modul name cv2.cv2’ 。关于这个 BUG 找遍网络也没有解决办法,为了它我重装4次,换了3种系统,卡了我10天时间。终于,在快要急秃头的时候,受大神启发,官网下载编译。左右无路,只能编译,还好成功了,特意记录心得如下。参考前辈经验:
https://blog.csdn.net/qq_37910312/article/details/72866242
https://blog.csdn.net/layallan/article/details/78328943
https://blog.csdn.net/qq_40548832/article/details/85115227
https://blog.csdn.net/qq_25005909/article/details/78554469
我主要参考第一个,它比较简单明了。其次,第三个也对我启发很大。
环境: debian9 aarch64 + python3.5
② 过程
首先,上官网下载源码 https://docs.opencv.org/3.4.6/d2/de6/tutorial_py_setup_in_ubuntu.html ,建议使用谷歌浏览器,因为它可以帮你翻译英文。。。。
进官网看一下文档,虽然比较老了,个别地方可能有出入,也看一下。如上图,选择自己需要版本,记得刷新一下,不然网络差的话,换版本也白换。
用 git 命令下载源码,我下的时候超时了,没成功,后来直接进网页下的,这个随你们,看具体情况。下载完成后,压缩包是在
/home/linaro/Download # 即 家目录的 Download 目录
# 然后解压缩,文件是个 zip 格式
unzip opencv-master.zip # 解压缩
# 解压缩后得到一个目录,叫 opencv-master
cd opencv-master
sudo mkdir build
cd build # 老套路
然后到这先停下,要配置一堆依赖库,关于依赖库很想吐槽,又多又杂,有些还搜不到。而且我的是 debian9 系统,官网中是 ubuntu 系统,可能个别安装包名字有出入,所以建议不要照着官网下,因为大都搜不到。
关于这个鄙人发现一个小 trick,就是你先
# 记得先更新 apt
sudo apt update
sudo apt upgrade
sudo apt-get install build-essential -y
sudo apt install python3-pip
sudo apt install python-opencv # 这个是安装在 python 2.7 下,而我需要是 python 3.5,所以不能用这招。
# 然后
sudo apt remove python-opencv # 它版本也太低,2.4+ 的版本,不能满足需要。
解释一下,因为 apt 安装 opencv 时,系统会连依赖库一起下好,而你卸载的时候,依赖库不会被卸载。所以用这招,下依赖库会快很多。不过保险一点还是选篇情况与你最相近的博客,借鉴一下。不要东抄西抄,这样效率低不说,还有可能出问题。
pip3 install setuptools
pip3 install wheel
pip install numpy
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev -y # 还是借鉴了第一篇博客
如果 libswscale-dev 下不成功,建议这样。此外好像没什么库下不成功,如果有其他的报错,上 https://packages.ubuntu.com/ 去搜名字版本是否有变化,及时更改。
sudo apt install libavutil-dev libswscale4
# 之后再试一下
sudo apt install libswscale-dev
之后就是编译了,先进上文创建的 build 目录,然后执行 cmake ,如果你要安装在 python 2 环境下,就直接 sudo cmake ,我是因为要安装在 python 3 上面才输一堆参数。
sudo cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local # opencv 安装路径
PYTHON3_EXECUTABLE=/usr/bin/python3 # 因为我要装在 python3.5 上,所以提供 python3 的 bin 命令
PYTHON_INCLUDE_DIR=/usr/include/python3.4 # 我的是 /usr/include/python3.5
# 特意把 我的路径 和 博客的路径 都贴给你们看,区别是不是不大,所以很好找,不要慌。
PYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.4m.so # 我的是 /usr/lib/aarch64-linux-gnu/libpython3.5m.so
# 我的是 /usr/local/lib/python3.5/dist-packages/numpy/core/include .. 。
PYTHON3_NUMPY_INCLUDE_DIRS=/usr/local/lib/python3.4/dist-packages/numpy/core/include .. # 最后的两点不要丢掉!!!
千万注意,以上路径要按着你真实路径来,不要瞎抄。基本和我这个差不多,即使名字会部分有区别,还是可以找到的。耐心点,不要急。cmake 之后,再
sudo make
会出来一大片绿色的字体。
开始编译的样子, 一片绿对了,要想生活过得去,头上就得是吧,如果中途报错的话要重新 cmake 。首先make clean 清空之前 make 的文件。
这我自己拍的,什么显示 python2 python3 ,说明两个版本都会装上 opencv 。上图是 make 完毕时的样子。可能是我以前波折太多,后来编译时很顺利。最后
sudo make install
安装很快的,安装好以后,进 python2 python3 ,import cv2 都没报错,说明 opencv 我终于搞定了。真不容易,在它手里吃的 BUG 比其他加起来还多。
③ 建立软链接
顺便说一句,opencv 默认是安装在 /usr/local/lib/python3.5 下的,如果你为 python3.5 创建了虚拟环境,还要建立个软连接。具体如下,现在 /usr/local 下找到 opencv 执行文件。
# .so 后缀就是 cv2 的执行文件
/usr/local/lib/python3.5/dist-packeages/cv2/python3.5/cv2.cpython-35m-aarch64-linux-gnu.so
然后进入虚拟环境
source venv/lib/activate
python
import sys
print(sys.path)
之后会打印出来 python 的调用库路径,选择一个,最好和其他的库放在一起,便于管理。我的是
/venv/lib/python3.5/site-packgaes
然后,建立软连接
sudo ln -s /usr/local/lib/python3.5/dist-packeages/cv2/python3.5/cv2.cpython-35m-aarch64-linux-gnu.so /venv/lib/python3.5/site-packgaes/cv2.so
在这之前,要保证你虚拟环境下的 python 3.5 安装了 numpy ,不然会报错。之后就是验证了,这个我讲了很多了,不写了。
一开始也装过 tensorflow ,也没报错,opencv 装好就这样了,不知道它们两个是不是犯冲。找了一下原因没头绪,报的错别人没经历过,自己瞎想。基于opencv 的经验,我觉得很有可能是版本原因,我是 debian9 aarch64 结构,而一般版本全是 x86_64 之类的,安装包也以他们居多。
上网找了下 tensorflow aarch64 版本的,还好有人替我编译好了。给出网址
https://github.com/lhelontra/tensorflow-on-arm/releases 。注意自己 pip 支持的版本,如果问我怎么看,如下:
python # 进入 python
# 以下是 python 交互模式
import pip._internal
print(pip._internal.pep425tags.get_supported())
如果支持,那就少了麻烦,否则只有更改安装包的名字了。然后就是 pip 安装,记得 cd 到安装包所在的目录 或者 输入绝对路径,我是在安装包目录中执行的。
# 不知道为什么,1.14.1 下不成功,可能是我网络原因,不过 1.13.1 能下
pip install tensorflow-1.13.1-cp35-none-linux_aarch64.whl
安装完毕后,老套路,确定是否成功。刚刚又安装了一次 tensorflow ,1.14.1各种安装慢、装不上,装1.13.1明显快很多。
python
import tensorflow as tf
tf.__version__ # '1.13.1'
len(dir(tf)) # 620