为 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 分支
krogoth
、BitBake Build Tool Core version 1.30.0
工作流工具
devtool
要求
它们应该作为硬件上的 python3.5 包可用
我想为以下对象创建食谱:
我在 $BUILD_DIR
中使用以下步骤:
devtool add pynmea2 https://github.com/Knio/pynmea2/archive/v1.7.1.tar.gz
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-python
和 pynmea2
的食谱添加 ${PYTHON_PN}-modules
。
更新
我更新了 GitHub gists,它现在在 RDEPENDS
中添加了 ${PYTHON_PN}-modules
,它可以在板上运行。
缺点
据我了解,添加 python3-modules
会增加您的映像占用空间,因为它需要在 rootfs 中添加很多模块。但是这些模块似乎对 运行 许多类型的应用程序都很重要,所以它有一个好处。
主机
Debian 9.4 服务器
Yocto 分支
krogoth
、BitBake Build Tool Core version 1.30.0
工作流工具
devtool
要求
它们应该作为硬件上的 python3.5 包可用
我想为以下对象创建食谱:
我在 $BUILD_DIR
中使用以下步骤:
devtool add pynmea2 https://github.com/Knio/pynmea2/archive/v1.7.1.tar.gz
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-python
和 pynmea2
的食谱添加 ${PYTHON_PN}-modules
。
更新
我更新了 GitHub gists,它现在在 RDEPENDS
中添加了 ${PYTHON_PN}-modules
,它可以在板上运行。
缺点
据我了解,添加 python3-modules
会增加您的映像占用空间,因为它需要在 rootfs 中添加很多模块。但是这些模块似乎对 运行 许多类型的应用程序都很重要,所以它有一个好处。