Mac OS下Anaconda环境中使用Swig触发PyThreadState_Get错误求助
解决Mac OS X Anaconda环境下Swig触发PyThreadState_Get错误的方案
我之前也碰到过一模一样的问题,这个致命错误本质是Anaconda环境的Python和Mac系统自带Python的链接冲突导致的——Swig编译的时候可能不小心用了系统的Python库,运行时却调用Anaconda的Python,直接搞崩了线程状态。下面是亲测有效的解决步骤:
1. 把编译环境绑定到Anaconda
首先激活你的目标Anaconda环境,然后强制让编译器优先用Anaconda里的Python头文件和库,别去碰系统的:
conda activate 你的环境名 export CFLAGS="-I$CONDA_PREFIX/include/python3.6m $CFLAGS" export LDFLAGS="-L$CONDA_PREFIX/lib -lpython3.6m $LDFLAGS"
注意把python3.6m换成你环境里实际的Python版本(比如3.8的话就是python3.8),可以用python --version确认。
2. 修正Swig编译配置
如果你的项目用了Makefile,一定要把里面的Python路径全改成Anaconda环境的:
- 把
PYTHON_INCLUDE改成$(CONDA_PREFIX)/include/pythonX.Xm - 把
PYTHON_LIB改成$(CONDA_PREFIX)/lib
另外,在你的Swig接口文件(.i文件)开头加一段代码,确保运行时优先用当前环境的Python:
%module 你的模块名 %pythonbegin %{ import sys sys.path.insert(0, '.') %}
3. 彻底重新编译
把之前编译生成的.dylib(Mac下的动态库文件)或者.so文件删掉,然后重新编译:
make clean make
4. 确认运行环境
编译完之后,一定要在激活的Anaconda环境里运行脚本,别搞错成系统Python了。可以用which python检查一下,输出的路径应该是你Anaconda环境下的Python。
这个问题的核心就是让Swig从编译到运行全链路都绑定Anaconda的Python,彻底和系统Python划清界限,这样线程状态就不会混乱了。
内容的提问来源于stack exchange,提问作者pkuhar
相关产品推荐
相关产品推荐

