我只能在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环境。
请参阅下面的最小工作示例。
答案 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)
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])"