【问题标题】:No Module named 'datetime' in python3 when creating a recipe for Yocto but datetime exists in python2.7为 Yocto 创建配方时,python3 中没有名为“datetime”的模块,但 python2.7 中存在 datetime
【发布时间】:2019-03-02 08:09:49
【问题描述】:

主机

Debian 9.4 服务器

Yocto 分支

krogoth, BitBake 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 Gist 中提到

GitHub 要点

Gists for pynmea2 and influxdb-python

图像创建

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

并为硬件烧录映像。

板

在板上,我运行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.confsn-p

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 层吗?)

【问题讨论】:

  • Python 3 中有一个 datetime 模块,你的设置可能有问题(权限错误?)
  • 如何在 yocto 中确定权限?
  • 完全不熟悉Yocto,但是你应该看到运行该程序的用户至少对/usr/lib/python3.5/datetime.py 具有读取权限。并弄清楚它是如何失去它的。

标签: python python-3.x embedded-linux yocto bitbake


【解决方案1】:

看看source/poky/meta/recipes-devtools/python/python-3.5-manifest.inc里面的python-3.5-manifest.inc文件

尝试使用以下命令显式拉入 python-datetime:

IMAGE_INSTALL_append += "python3-datetime"

【讨论】:

  • 我尝试通过IMAGE_INSTALL_append 明确添加它,但没有奏效。我会调查manifest.inc。如果不存在,您能否建议如何更新文件?
【解决方案2】:

解决方案

我看到This particular blogpost 的一个小sn-p 提到在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"

这很完美。

附言

此时我不确定是否应该在RDEPENDS_${PN} 中为influxdb-python 和pynmea2 的配方添加${PYTHON_PN}-modules。

更新

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

缺点

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 2020-04-16
    • 2019-08-20
    相关资源
    最近更新 更多