扩展中的致命错误:PyThreadState_Get:在Mac上使用带有Anaconda3的SWIG时没有当前线程

时间:2018-01-16 21:08:12

标签: macos anaconda swig

我只能在Mac上使用anaconda3和swig获得此错误。有没有人对如何解决这个问题有任何建议?

这是test.i文件。

# test.i
%module test

%{
int hello();
%}

这是test.c文件。

//test.c
#include <stdio.h>

int hello() {

    printf("Hello\n");
    return 0;

}

这是创建扩展程序的编译步骤。

$ swig -python test.i
$ cc -c $(python3-config  --cflags) test.c test_wrap.c
$ cc -bundle -L/Users/$USER/miniconda3/lib/python3.6/config-3.6m-darwin -lpython3.6m -ldl test.o test_wrap.o -o _test.so

$ python test.py
Fatal Python error: PyThreadState_Get: no current thread

[1]    97445 abort      python test.py

同样,任何其他操作系统都没有错误。他们相应的步骤工作。它适用于Homebrew Python2,适用于Homebrew Python3。它也适用于Anaconda2。但它不适用于Anaconda3或Anaconda3环境。

请参阅下面的最小工作示例。

https://github.com/kdheepak/mwe-swig-python3-anaconda

2 个答案:

答案 0 :(得分:2)

问题很可能是你试图链接python3.6库,而python可执行文件已经链接了python库。

尝试像setup.py那样做(这与你的github示例一起工作正常):

#!/usr/bin/env python
from distutils.core import setup, Extension
test_module = Extension('_test', sources=['test_wrap.c', 'test.c'],)
setup (name = 'test', version = '0.1', ext_modules = [test_module], py_modules = ["test"],)

您将看到这会创建一个链接命令,该命令使用-undefined dynamic_lookup而不显式链接到python3.6m或ld库。

答案 1 :(得分:1)

在为Python创建扩展模块时,

python3-config --cflags应该,也不应该始终链接到Python库。相反,您应该查询Python本身(特别是distutils sysconfig模块)以获取适当的值。

应通过以下方式查询编译器标志: python -c "from distutils import sysconfig; print(sysconfig.get_config_vars('CFLAGS'))"

应通过以下方式查询链接器标志: python -c "from distutils import sysconfig; print(sysconfig.get_config_var('BLDSHARED').split(' ', 1)[1])"