嵌入Python的C++代码运行报错:ImportError: cannot import name _remove_dead_weakref
ImportError: cannot import name _remove_dead_weakref问题 从你的描述来看,这个问题大概率是Python版本升级后,C++嵌入代码没有正确链接到新的Homebrew Python 2.7.14_2库,或者运行时加载了旧版本的Python模块/库导致的。下面是具体的排查和解决步骤:
1. 确认编译时使用的是正确的Python配置参数
先手动执行python-config --ldflags和python-config --cflags,检查输出内容是不是指向Homebrew的Python 2.7.14_2路径(比如/usr/local/opt/python/Frameworks/Python.framework/Versions/2.7)。
然后打开你的Makefile,确保其中的CFLAGS、LDFLAGS完全使用这两个命令的输出,而不是之前旧版本的缓存值。比如:
CFLAGS += $(shell python-config --cflags) LDFLAGS += $(shell python-config --ldflags)
2. 清理旧编译产物,重新编译
旧的目标文件或链接缓存可能还绑定着旧版本的Python库,执行以下命令彻底重建:
make clean make
3. 检查可执行文件的链接依赖
用otool工具查看你的C++程序实际链接的Python库路径:
otool -L ./your_executable_name
在输出里找到Python相关的条目,确认路径是/usr/local/opt/python/Frameworks/Python.framework/Versions/2.7/Python,而不是系统自带的Python(/System/Library/Frameworks/Python.framework)或者旧版本的Homebrew Python路径。
如果路径不对,说明编译时没有正确链接新库,回到步骤1检查Makefile配置,重新编译。
4. 验证Python环境本身是否正常
先排除Python安装的问题:直接在终端运行python,然后输入import weakref,如果这一步就报错,说明Homebrew的Python 2.7.14_2安装有问题,尝试重新安装:
brew uninstall python@2 brew install python@2
安装完成后再次验证import weakref是否正常。
5. 检查运行时的库加载路径
macOS的补充更新可能调整了动态库加载规则,确保你的程序能找到Homebrew的Python库。可以查看程序的rpath设置:
otool -l ./your_executable_name | grep -A 5 LC_RPATH
确认输出中包含/usr/local/opt/python/Frameworks/Python.framework/Versions/2.7/lib,如果没有,可能需要在编译时手动添加rpath参数到LDFLAGS里:
LDFLAGS += -Wl,-rpath,/usr/local/opt/python/Frameworks/Python.framework/Versions/2.7/lib
按照以上步骤逐一排查,应该能解决这个导入错误。
内容的提问来源于stack exchange,提问作者A. Drew

