MATLAB调用含from tensorflow import keras的Python脚本报错求助
from tensorflow import keras触发的h5py AttributeError问题 根据你描述的场景,这个AttributeError: type object 'h5py.h5r.Reference' has no attribute '__reduce_cython__'错误是MATLAB的Python集成环境和独立Python进程之间的加载机制差异导致的——独立运行时h5py的Cython扩展能正常初始化,但在MATLAB交互环境中,模块加载顺序和延迟加载特性会让h5py的关键属性没被正确注册,进而被Tensorflow的导入流程触发报错。
下面是几个针对性的解决方案,不需要改用系统调用或调整导入语句的替代方案:
1. 确保MATLAB使用的Python环境和本地运行环境完全一致
首先确认MATLAB加载的Python版本和你本地运行python test_from_import.py的版本完全匹配:
- 在MATLAB中运行
py.sys.version,对比本地Python命令行的python --version输出。 - 如果不一致,重新运行
pyversion指定正确的Python路径,然后重启MATLAB(MATLAB会缓存Python环境,必须重启才会生效)。
2. 降级h5py到兼容版本
你当前使用的h5py 2.9.0和Tensorflow 1.14.0、Python3.7在MATLAB环境下存在兼容性问题,建议降级到h5py 2.8.0:
打开命令行,切换到MATLAB指定的Python环境目录,执行:
C:\Users\dmattioli\AppData\Local\Programs\Python\Python37\python.exe -m pip install h5py==2.8.0 --force-reinstall
这个版本的h5py在处理Cython属性初始化时,更适配MATLAB的Python集成环境。
3. 修改Python脚本的导入顺序,强制提前初始化h5py
在你的test_from_import.py开头添加h5py的手动初始化代码,确保在Tensorflow导入前完成h5py的Cython组件加载:
# 提前初始化h5py的核心组件 import h5py from h5py.h5r import Reference # 再导入Tensorflow相关模块 from tensorflow import keras from tensorflow.keras import backend as K
这样可以绕过MATLAB环境下的模块延迟加载问题,让h5py的关键属性在Tensorflow依赖它之前就被正确注册。
4. 调整MATLAB中Python路径的添加逻辑
你当前添加路径的顺序可能导致库加载冲突,建议修改MATLAB代码中的路径插入顺序,并且移除不必要的MATLAB toolbox路径:
testDir = '.....' % test_from_import.py所在目录 addpath(testDir) % 指定Python可执行文件路径 pcPythonExeDir = 'C:\Users\dmattioli\AppData\Local\Programs\Python\Python37\python.exe'; [ver, exec, loaded] = pyversion(pcPythonExeDir); pyversion % 打印到命令行 % 包含相关Python库的目录 pyLibraryDir = 'C:\Users\dmattioli\AppData\Local\Programs\Python\Python37\Lib\site-packages'; % 调整路径顺序:优先加载Python的site-packages,再加载脚本目录 insert(py.sys.path, int64(0), pyLibraryDir); insert(py.sys.path, int64(0), testDir); %% 调用Python脚本 py_test_mod = py.importlib.import_module('test_from_import')
注意:MATLAB的pyDir是给MATLAB自身用的集成工具路径,不需要添加到Python的sys.path中,添加反而可能导致库加载混淆。
验证步骤
完成上述操作后,必须重启MATLAB,然后重新运行你的MATLAB代码,应该就能正常导入Python脚本了。
内容的提问来源于stack exchange,提问作者Dominik Mattioli

