为 Yocto 创建配方时 python3 中没有名为 'datetime' 的模块,但日期时间存在于 python2.7

No Module named 'datetime' in python3 when creating a recipe for Yocto but datetime exists in python2.7

主机

Debian 9.4 服务器

Yocto 分支

krogothBitBake Build Tool Core version 1.30.0

工作流工具

devtool

要求

它们应该作为硬件上的 python3.5 包可用

我想为以下对象创建食谱:

  1. pynmea2 v1.7.1
  2. influxdb-python v5.2.0

我在 $BUILD_DIR 中使用以下步骤:

  1. devtool add pynmea2 https://github.com/Knio/pynmea2/archive/v1.7.1.tar.gz
  2. devtool add influxdb-python https://github.com/influxdata/influxdb-python/archive/v5.2.0.tar.gz

我从工具中获取食谱。我将所有 运行 时间依赖项的 RDEPENDS_${PN} += "python-re" 更改为 RDEPENDS_${PN} += "${PYTHON_PN}-re",并将此信息转移到它们各自的 .inc 文件中。这些文件在下面 Github 要点

中提到

GitHub要点

Gists for pynmea2 and influxdb-python

图像创作

对于本地测试,我将这些食谱从 workspace 文件夹(由 devtool 自动创建)添加到 `IMAGE_INSTALL_append = " influxdb-[ 下的 local.conf =123=]pynmea2

并为硬件刻录镜像。

董事会

在板子上,我运行 python3 shell 看能不能导入这些包。这是 shell:

的输出

pynmea2:

Python 3.5.1 (default, Sep 25 2018, 19:27:54)
[GCC 5.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pynmea2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.5/site-packages/pynmea2/__init__.py", line 13, in <module>
    from .types import *
  File "/usr/lib/python3.5/site-packages/pynmea2/types/__init__.py", line 3, in <module>
    from .talker import *
  File "/usr/lib/python3.5/site-packages/pynmea2/types/talker.py", line 3, in <module>
    from ..nmea_utils import *
  File "/usr/lib/python3.5/site-packages/pynmea2/nmea_utils.py", line 2, in <module>
    import datetime
ImportError: No module named 'datetime'

influxdb-python:

Python 3.5.1 (default, Sep 25 2018, 19:27:54)
[GCC 5.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import influxdb
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.5/site-packages/influxdb/__init__.py", line 9, in <module>
    from .client import InfluxDBClient
  File "/usr/lib/python3.5/site-packages/influxdb/client.py", line 14, in <module>
    import requests
  File "/usr/lib/python3.5/site-packages/requests/__init__.py", line 58, in <module>
    from . import utils
  File "/usr/lib/python3.5/site-packages/requests/utils.py", line 12, in <module>
    import cgi
  File "/usr/lib/python3.5/cgi.py", line 30, in <module>
    from email.parser import FeedParser
  File "/usr/lib/python3.5/email/parser.py", line 12, in <module>
    from email.feedparser import FeedParser, BytesFeedParser
  File "/usr/lib/python3.5/email/feedparser.py", line 27, in <module>
    from email import message
  File "/usr/lib/python3.5/email/message.py", line 16, in <module>
    from email import utils
  File "/usr/lib/python3.5/email/utils.py", line 30, in <module>
    import datetime
ImportError: No module named 'datetime'

对比度

如果我运行板上的python命令并尝试import datetime,模块存在。

问题是什么?为什么 datetime 不能作为 python 3.5 的模块使用?

local.conf 片段

IMAGE_INSTALL_append = " python3 python3-dev python3-enum pynmea2 influxdb-python python3-pyserial " 

编辑

我还在local.conf文件中明确添加了IMAGE_INSTALL_append = " python3-datetime"。但是还是一样的错误。

python-3.5-manifest.inc

SUMMARY_${PN}-modules="All Python modules"
RDEPENDS_${PN}-modules="${PN}-2to3 ${PN}-argparse ${PN}-asyncio ${PN}-audio ${PN}-codecs ${PN}-compile ${PN}-compression ${PN}-core ${PN}-crypt ${PN}-ctypes ${PN}-curses ${PN}-datetime ${PN}-db ${PN}-debugger ${PN}-difflib ${PN}-distutils ${PN}-doctest ${PN}-email ${PN}-enum ${PN}-fcntl ${PN}-gdbm ${PN}-html ${PN}-idle ${PN}-image ${PN}-importl
ib ${PN}-io ${PN}-json ${PN}-lang ${PN}-logging ${PN}-mailbox ${PN}-math ${PN}-mime ${PN}-mmap ${PN}-multiprocessing ${PN}-netclient ${PN}-netserver ${PN}-numbers ${PN}-pickle ${PN}-pkgutil ${PN}-pprint ${PN}-profile ${PN}-pydoc ${PN}-re ${PN}-readline ${PN}-reprlib ${PN}-resource ${PN}-selectors ${PN}-shell ${PN}-signal ${PN}-smtpd ${PN}-sqlit
e3 ${PN}-sqlite3-tests ${PN}-stringold ${PN}-subprocess ${PN}-syslog ${PN}-terminal ${PN}-tests ${PN}-textutils ${PN}-threading ${PN}-tkinter ${PN}-unittest ${PN}-unixadmin ${PN}-xml ${PN}-xmlrpc  "
ALLOW_EMPTY_${PN}-modules = "1"

清单文件中已有 datetime?如果有必要,我应该在文件中更改什么? (我应该把它添加到 meta-custom 层吗?)

查看 source/poky/meta/recipes-devtools/python/python-3.5-manifest.inc

中的 python-3.5-manifest.inc 文件

尝试使用 python-datetime 显式拉入:

IMAGE_INSTALL_append += "python3-datetime"

解决方案

我看到 This particular blogpost 的一小段,其中提到在 INSTALL_IMAGE_append 中使用 python-modules

看过问题中提到的python-3.5-manifest.inc文件;我看到 -modules 将为我提供我的应用程序所需的所有基本模块 运行。

测试

因此,在 local.conf 文件中,我添加了 IMAGE_INSTALL_appends = " python3-modules" 并将图像加载到硬件上。这个事实非常有效。

现在 python3 shell,我没有收到任何 datetime 模块错误。

现在 local.conf 的代码段

IMAGE_INSTALL_append = " python3-modules influxdb-python pynmea2 pyserial"

这很完美。

p.s.

我现在不确定是否应该在 RDEPENDS_${PN} 中为 influxdb-pythonpynmea2 的食谱添加 ${PYTHON_PN}-modules

更新

我更新了 GitHub gists,它现在在 RDEPENDS 中添加了 ${PYTHON_PN}-modules,它可以在板上运行。

缺点

据我了解,添加 python3-modules 会增加您的映像占用空间,因为它需要在 rootfs 中添加很多模块。但是这些模块似乎对 运行 许多类型的应用程序都很重要,所以它有一个好处。