分类 综合 下的文章

背景

今天在给树莓配安装tensorflow的使用,提示tensorflow-2.0.0-cp37-none-linux_armv7l.whl is not a supported wheel on this platform。
出现这个问题,是由于这个whl和系统python版本不匹配导致的。网上有不少教程提供了查看python支持whl名称的方法。
然而,网上的教程非常老旧,按照网上教程操作后,会提示pip has no attribute pep425tags。经过我多次搜集资料和尝试,总算找到了在pip 20.0等版本上可用的命令!

1 已知无效的方法

首先列举对于较新版本的pip无效的方法。如果你使用的是较新版本的pip,使用下面这些python语句,将会提示pip has no attribute pep425tags
无效旧教程一:

import pip
print(pip.pep425tags.get_supported())

无效旧教程二:

import pip._internal
print(pip._internal.pep425tags.get_supported())

上面为目前网上大量充斥的教程,这些均为旧版pip的教程并不适用于pip 20.0及以上版本,甚至不适用于临近pip 20.0的版本
使用上述旧教程,会得到pip has no attribute pep425tags。如下图所示。

在此,经过博主大量搜集资料和尝试,终于找到了在pip 20.0版本上可用的方法。

2 经测试有效的命令

我们可以通过下面这个经过测试有效的命令,来查看当前Python版本匹配那些文件。
有效命令如下(直接在命令行中输入,不要在Python解释器输入哦):

pip debug --verbose

输入这个命令后,会输出大量信息:

pip version: pip 20.1.1 from /home/pi/Softwares/venv3/lib/python3.7/site-packages/pip (python 3.7)
sys.version: 3.7.3 (default, Dec 20 2019, 18:57:59) 
[GCC 8.3.0]
sys.executable: /home/pi/Softwares/venv3/bin/python
sys.getdefaultencoding: utf-8
sys.getfilesystemencoding: utf-8
locale.getpreferredencoding: UTF-8
sys.platform: linux
sys.implementation:
  name: cpython
'cert' config value: global
REQUESTS_CA_BUNDLE: None
CURL_CA_BUNDLE: None
pip._vendor.certifi.where(): /home/pi/Softwares/venv3/lib/python3.7/site-packages/pip/_vendor/certifi/cacert.pem
pip._vendor.DEBUNDLED: False
vendored library versions:
  appdirs==1.4.3
  CacheControl==0.12.6
  colorama==0.4.3
  contextlib2==0.6.0.post1 (Unable to locate actual module version, using vendor.txt specified version)
  distlib==0.3.0
  distro==1.5.0 (Unable to locate actual module version, using vendor.txt specified version)
  html5lib==1.0.1
  ipaddress==1.0.23
  msgpack==1.0.0 (Unable to locate actual module version, using vendor.txt specified version)
  packaging==20.3
  pep517==0.8.2
  progress==1.5
  pyparsing==2.4.7
  requests==2.23.0
  certifi==2020.04.05.1
  chardet==3.0.4
  idna==2.9
  urllib3==1.25.8
  resolvelib==0.3.0
  retrying==1.3.3 (Unable to locate actual module version, using vendor.txt specified version)
  setuptools==44.0.0 (Unable to locate actual module version, using vendor.txt specified version)
  six==1.14.0
  toml==0.10.0
  webencodings==0.5.1 (Unable to locate actual module version, using vendor.txt specified version)
Compatible tags: 44
  cp37-cp37m-manylinux2014_armv7l
  cp37-cp37m-linux_armv7l
  cp37-abi3-manylinux2014_armv7l
  cp37-abi3-linux_armv7l
  cp37-none-manylinux2014_armv7l
  cp37-none-linux_armv7l
  cp36-abi3-manylinux2014_armv7l
  cp36-abi3-linux_armv7l
  cp35-abi3-manylinux2014_armv7l
  cp35-abi3-linux_armv7l
  cp34-abi3-manylinux2014_armv7l
  cp34-abi3-linux_armv7l
  cp33-abi3-manylinux2014_armv7l
  cp33-abi3-linux_armv7l
  cp32-abi3-manylinux2014_armv7l
  cp32-abi3-linux_armv7l
  py37-none-manylinux2014_armv7l
  py37-none-linux_armv7l
  py3-none-manylinux2014_armv7l
  py3-none-linux_armv7l
  py36-none-manylinux2014_armv7l
  py36-none-linux_armv7l
  py35-none-manylinux2014_armv7l
  py35-none-linux_armv7l
  py34-none-manylinux2014_armv7l
  py34-none-linux_armv7l
  py33-none-manylinux2014_armv7l
  py33-none-linux_armv7l
  py32-none-manylinux2014_armv7l
  py32-none-linux_armv7l
  py31-none-manylinux2014_armv7l
  py31-none-linux_armv7l
  py30-none-manylinux2014_armv7l
  py30-none-linux_armv7l
  cp37-none-any
  py37-none-any
  py3-none-any
  py36-none-any
  py35-none-any
  py34-none-any
  py33-none-any
  py32-none-any
  py31-none-any
  py30-none-any

从中我们可以看到Compatible tags字样,这些就是当前Python版本可以适配的标签。例如,我的Python版本是3.7.3,可以匹配下面这些文件名:

 Compatible tags: 44
  cp37-cp37m-manylinux2014_armv7l
  cp37-cp37m-linux_armv7l
  cp37-abi3-manylinux2014_armv7l
  cp37-abi3-linux_armv7l
  cp37-none-manylinux2014_armv7l
  cp37-none-linux_armv7l
  cp36-abi3-manylinux2014_armv7l
  cp36-abi3-linux_armv7l
  cp35-abi3-manylinux2014_armv7l
  cp35-abi3-linux_armv7l
  cp34-abi3-manylinux2014_armv7l
  cp34-abi3-linux_armv7l
  cp33-abi3-manylinux2014_armv7l
  cp33-abi3-linux_armv7l
  cp32-abi3-manylinux2014_armv7l
  cp32-abi3-linux_armv7l
  py37-none-manylinux2014_armv7l
  py37-none-linux_armv7l
  py3-none-manylinux2014_armv7l
  py3-none-linux_armv7l
  py36-none-manylinux2014_armv7l
  py36-none-linux_armv7l
  py35-none-manylinux2014_armv7l
  py35-none-linux_armv7l
  py34-none-manylinux2014_armv7l
  py34-none-linux_armv7l
  py33-none-manylinux2014_armv7l
  py33-none-linux_armv7l
  py32-none-manylinux2014_armv7l
  py32-none-linux_armv7l
  py31-none-manylinux2014_armv7l
  py31-none-linux_armv7l
  py30-none-manylinux2014_armv7l
  py30-none-linux_armv7l
  cp37-none-any
  py37-none-any
  py3-none-any
  py36-none-any
  py35-none-any
  py34-none-any
  py33-none-any
  py32-none-any
  py31-none-any
  py30-none-any

这是真正解决了网上旧教程无效的问题。适用于pip 20.0等新版本的pip。

3 注意

之前旧版本的无效方法是Python语句,而此次有效命令则是pip命令,直接在命令行中输入,不要在Python解释器中输入哦

4 修改记录

2020.9.28 修改部分句子,使语言更通顺。
2020.10.8 改正错别字,纠正了部分不准确的说法。
2020.11.30 修改了部分语句。

本文首发于我的编程之路,文章链接:https://www.wangliguang.cn/?p=401,未经允许禁止商业网站转载,如需转载请联系作者。个人基于技术学习目的转载和分享本文时无需许可,但必须指明本文作者和原文链接并保留本段文字,否则禁止转载。

1 背景

给树莓派安装一个TensorFlow吧!网上很多教程陈旧且有错误。本文经过作者大量查阅资料和TensorFlow官网,并亲自测试安装成功!
硬件准备:树莓派3B+
操作系统:Raspberry Pi OS 2020年5月版

2 操作方法

1、树莓派系统切换国内镜像。
树莓派系统切换国内镜像请参考此文:https://www.wangliguang.cn/?p=394

2、检查环境是否已经安装。

python3 --version
pip3 --version
virtualenv --version

如果某一条命令运行时提示未找到,则未安装,需要在第三步中选择相应命令安装。

3、安装未安装的模块,根据第2步,从下面命令中按需选择即可,其中安装libatlas-base-dev的命令必选

sudo apt update
sudo apt install python3-dev python3-pip  # 如已经安装了Python3和pip3则跳过此命令
sudo apt install libatlas-base-dev  # 此命令必选,注意!!!
sudo pip3 install -U virtualenv  # 如果已经安装了虚拟环境,跳过此命令

4、创建虚拟环境。

virtualenv --system-site-packages -p python3 ./venv

5、激活虚拟环境。

source ./venv/bin/activate

6、pip切换国内源。
为防止网速过慢,建议pip也切换国内源。此处选择清华源。

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

7、更新pip。

pip install --upgrade pip

8、安装依赖包

pip install keras_applications==1.0.8 --no-deps
pip install keras_preprocessing==1.1.0 --no-deps
pip install h5py==2.9.0
pip install -U six wheel mock

在安装依赖包时,有的包清华源有,安装速度很快。有的包清华源没有,会到默认源去下载,会很慢甚至超时失败。如遇超时失败需要重试。

9、下载TensorFlow2.0。
下载链接: https://github.com/lhelontra/tensorflow-on-arm/releases
推荐tensorflow-2.0.0-cp37-none-linux_armv7l.whl这个版本,因为我安装这个版本成功了。
如果速度过慢,可以直接百度tensorflow-2.0.0-cp37-none-linux_armv7l.whl,有很多国内资源站有这个。
下载后,通过Xftp传到树莓派上。

10、安装TensorFlow。进入到tensorflow-2.0.0-cp37-none-linux_armv7l.whl所在目录,输入以下命令,等待安装完成。

pip install tensorflow-2.0.0-cp37-none-linux_armv7l.whl

11、测试安装结果。
输入如下命令:

python -c "import tensorflow as tf;print(tf.reduce_sum(tf.random.normal([1000, 1000])))"

如输出`tf.Tensor(1035.3678, shape=(), dtype=float32)
`则表示安装成功!

用完后,可以使用deactivate退出虚拟环境。

12、安装失败后的处理。
如果安装失败,可以重试。此时使用rm -r venv/删除安装失败的TensorFlow所在虚拟环境,即可从第4步开始重试。

注意,从第5步开始,一直处于虚拟环境哦。

3 支持作者

写文章不易,如果这篇文章有帮到你,希望你能给予一定赞赏。您可以通过当前网站或App的赞赏渠道支持,或者点击此处支持作者