使用Python实现datetime时NumPy导入失败,报多数组初始化未报告异常
解决CPython 3.6中datetime模块导致NumPy导入失败的问题
我来帮你搞定这个头疼的问题!在CPython 3.6这个版本里,datetime模块的一段清理逻辑确实会和NumPy的初始化产生冲突,我之前帮朋友排查过类似的情况。
问题根源
你提到的datetime模块末尾的那段代码是关键:当成功导入更快的C语言实现_datetime后,它会执行del语句删除所有Python实现里定义的模块级变量(比如_DAYNAMES、_DAYS_BEFORE_MONTH这些)。而NumPy在初始化multiarray的时候,会尝试访问datetime模块里的这些内部变量,结果找不到就抛出了"initialization of multiarray raised unreported exception"这个报错。
具体解决办法
1. 临时应急修复(快速生效)
直接修改Python标准库的datetime模块源码:
- 找到你Python安装目录下的
Lib/datetime.py文件 - 定位到那段
else:后面的del (...)代码块,把整个del块注释掉或者直接删除 - 保存文件后重新尝试导入NumPy,应该就能正常工作了
注意:修改标准库源码只是临时方案,适合快速测试或者暂时无法升级Python的场景,长期来看还是推荐升级版本。
2. 根本解决方案(推荐)
升级你的Python版本到3.7及以上。Python 3.7对datetime模块的清理逻辑做了调整,不会再删除那些可能被第三方库依赖的内部变量,从根源上解决了这个冲突。
3. 不修改标准库的临时方案(繁琐但可行)
在导入NumPy之前,手动保存datetime模块里会被删除的变量:
import datetime # 提前保存所有会被删除的变量 datetime._DAYNAMES = datetime._DAYNAMES datetime._DAYS_BEFORE_MONTH = datetime._DAYS_BEFORE_MONTH datetime._DAYS_IN_MONTH = datetime._DAYS_IN_MONTH datetime._DI100Y = datetime._DI100Y datetime._DI400Y = datetime._DI400Y datetime._DI4Y = datetime._DI4Y datetime._EPOCH = datetime._EPOCH datetime._MAXORDINAL = datetime._MAXORDINAL datetime._MONTHNAMES = datetime._MONTHNAMES datetime._build_struct_time = datetime._build_struct_time datetime._check_date_fields = datetime._check_date_fields # 把del语句里的所有变量都照这样保存一遍 import numpy
这个办法需要把所有被del的变量都手动保存,比较麻烦,所以更推荐前两种方案。
内容的提问来源于stack exchange,提问作者Saim Raza
相关产品推荐
相关产品推荐

