Python 模块 'datetime' 没有属性 'datetime_CAPI'

Python module 'datetime' has no attribute 'datetime_CAPI'

我需要在具有 ARM SoC 的嵌入式系统中 运行 numpy,因此我使用 arm-linux-gnueabihf- 交叉编译了 Python 3.8.10 和 Numpy-海合会。然后我将可执行文件和库都复制到嵌入式系统。但是当我尝试导入 numpy 时,出现以下错误:

>>> import numpy
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.8/dist-packages/numpy/__init__.py", line 142, in <module>
    from . import core
  File "/usr/lib/python3.8/dist-packages/numpy/core/__init__.py", line 17, in <module>
    from . import multiarray
  File "/usr/lib/python3.8/dist-packages/numpy/core/multiarray.py", line 14, in <module>
    from . import overrides
  File "/usr/lib/python3.8/dist-packages/numpy/core/overrides.py", line 7, in <module>
    from numpy.core._multiarray_umath import (
AttributeError: module 'datetime' has no attribute 'datetime_CAPI'

于是查看了datetime的属性:

>>> import datetime as dt
>>> dir(dt)
['MAXYEAR', 'MINYEAR', '_DAYNAMES', '_DAYS_BEFORE_MONTH', '_DAYS_IN_MONTH', '_DI100Y', '_DI400Y', '_DI4Y', 
'_EPOCH', '_MAXORDINAL', '_MONTHNAMES', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', 
'__name__', '__package__', '__spec__', '_build_struct_time', '_check_date_fields', '_check_int_field', '
_check_time_fields', '_check_tzinfo_arg', '_check_tzname', '_check_utc_offset', '_cmp', '_cmperror', 
'_date_class', '_days_before_month', '_days_before_year', '_days_in_month', '_divide_and_round', '_format_offset', 
'_format_time', '_is_leap', '_isoweek1monday', '_math', '_ord2ymd', '_parse_hh_mm_ss_ff', '_parse_isoformat_date', 
'_parse_isoformat_time', '_time', '_time_class', '_tzinfo_class', '_wrap_strftime', '_ymd2ord', 'date', 'datetime', 
'sys', 'time', 'timedelta', 'timezone', 'tzinfo']

我注意到两件事,一个是私有函数正在显示,另一个是属性“datetime_CAPI”不存在。这解释了为什么它显示该错误。 我在用于构建 Python 的 PC 上做了同样的检查,我得到:

>>> import datetime as dt
>>> dir(dt)
['MAXYEAR', 'MINYEAR', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', 
'__package__', '__spec__', 'date', 'datetime', 'datetime_CAPI', 'sys', 'time', 'timedelta', 'timezone', 'tzinfo']

检查“datetime_CAPI_ 属性显示:

>>> dt.datetime_CAPI
<capsule object "datetime.datetime_CAPI" at 0x7f58e6242720>

它似乎是某种用于从 Python 调用 C 函数的对象。 但是为什么不见了?

我发现了问题,这是一个 Python 编译问题。我使用以下命令编译Python,问题解决

CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++ AR=arm-linux-gnueabihf-ar \
    RANLIB=arm-linux-gnueabihf-ranlib \
    ./configure --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf \
    --build=x86_64-linux-gnu --prefix=$HOME/python3.8.10 \
    --disable-ipv6 ac_cv_file__dev_ptmx=no ac_cv_file__dev_ptc=no \
    ac_cv_have_long_long_format=yes --enable-shared

make HOSTPYTHON=$HOME/python3.8.10 \
    BLDSHARED="arm-linux-gnueabihf-gcc -shared" CROSS-COMPILE=arm-linux-gnueabihf- \
    CROSS_COMPILE_TARGET=yes HOSTARCH=arm-linux BUILDARCH=arm-linux-gnueabihf

make altinstall HOSTPYTHON=$HOME/python3.8.10 \
    BLDSHARED="arm-linux-gnueabihf-gcc -shared" CROSS-COMPILE=arm-linux-gnueabihf- \
    CROSS_COMPILE_TARGET=yes HOSTARCH=arm-linux BUILDARCH=arm-linux-gnueabihf \
    prefix=$HOME/python3.8.10/_install