SWIG Python 包装器在 Mac OSX 上崩溃
SWIG Python wrappers crash on Mac OSX
我正在尝试为 C 函数创建一个简单的 SWIG Python 包装器,但它总是因
而崩溃
Fatal Python error: PyThreadState_Get: no current thread
我读到这种错误是由于在 building/linking 和 运行 时使用不同版本的 python
引起的,但据我所知,情况并非如此这里。
我下载、构建并安装了一个全新的 python 3.4.4。我已验证我使用的文件是新文件。
我愿意:
swig -python -o example_wrap.c -I. -I/usr/local/include/python3.4m example.i
cc -fPIC -I. -I/usr/local/include/python3.4m -c example.c
cc -fPIC -I. -I/usr/local/include/python3.4m -c example_wrap.c
cc -shared -o _example.so example.o example_wrap.o /usr/local/lib/libpython3.4m.a
/usr/local/bin/python3.4 -c "import example"
为了确定,我尝试了 clang
和 gcc-mp-4.9
(来自 MacPorts),而不是 cc
,结果都相同。
Fatal Python error: PyThreadState_Get: no current thread
这在 Linux 上工作得很好。我不相信我正在链接任何框架(但 python3.4
确实如此)。
我在这里错过了什么?
代码如下:
example.h
#ifndef HELLO_H
#define HELLO_H
extern void hello();
#endif
example.c
#include <stdio.h>
void hello() {
printf("Hello\n");
}
example.i
%module example
%{
#include "example.h"
%}
%include "example.h"
链接如下:
otool -L /usr/local/bin/python3.4
/usr/local/bin/python3.4:
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1258.1.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)
otool -L _example.so
_example.so:
_example.so (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)
我认为你应该 link 使用:
cc -shared -o _example.so example.o example_wrap.o -L/usr/local/lib -lpython3.4m
否则,libpython3.4m.a
中的某些符号可能包含在您的共享对象中,然后在从 python 导入时可用两次 (?)。
无论如何,在我的系统上(OSX 10.11,使用 MacPorts Python 3.4),两者都可以工作。
我正在尝试为 C 函数创建一个简单的 SWIG Python 包装器,但它总是因
而崩溃Fatal Python error: PyThreadState_Get: no current thread
我读到这种错误是由于在 building/linking 和 运行 时使用不同版本的 python
引起的,但据我所知,情况并非如此这里。
我下载、构建并安装了一个全新的 python 3.4.4。我已验证我使用的文件是新文件。 我愿意:
swig -python -o example_wrap.c -I. -I/usr/local/include/python3.4m example.i
cc -fPIC -I. -I/usr/local/include/python3.4m -c example.c
cc -fPIC -I. -I/usr/local/include/python3.4m -c example_wrap.c
cc -shared -o _example.so example.o example_wrap.o /usr/local/lib/libpython3.4m.a
/usr/local/bin/python3.4 -c "import example"
为了确定,我尝试了 clang
和 gcc-mp-4.9
(来自 MacPorts),而不是 cc
,结果都相同。
Fatal Python error: PyThreadState_Get: no current thread
这在 Linux 上工作得很好。我不相信我正在链接任何框架(但 python3.4
确实如此)。
我在这里错过了什么?
代码如下:
example.h
#ifndef HELLO_H
#define HELLO_H
extern void hello();
#endif
example.c
#include <stdio.h>
void hello() {
printf("Hello\n");
}
example.i
%module example
%{
#include "example.h"
%}
%include "example.h"
链接如下:
otool -L /usr/local/bin/python3.4
/usr/local/bin/python3.4:
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1258.1.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)
otool -L _example.so
_example.so:
_example.so (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)
我认为你应该 link 使用:
cc -shared -o _example.so example.o example_wrap.o -L/usr/local/lib -lpython3.4m
否则,libpython3.4m.a
中的某些符号可能包含在您的共享对象中,然后在从 python 导入时可用两次 (?)。
无论如何,在我的系统上(OSX 10.11,使用 MacPorts Python 3.4),两者都可以工作。