Mac 中 Python 的带有 SWIG 的 C++ 最小示例
Minimal example of C++ with SWIG for Python in Mac
我正在尝试在 OSX.
中使用 SWIG 为某些 C++ 代码编译一个 python 包装器的最小示例
/* File : example.c */
double My_variable = 3.0;
int fact(int n) {
if (n <= 1) return 1;
else return n*fact(n-1);
}
int my_mod(int x, int y) {
return (x%y);
}
和接口文件:
/* example.i */
%module example
%{
/* Put header files here or function declarations like below */
extern int fact(int n);
extern int my_mod(int x, int y);
%}
extern int fact(int n);
extern int my_mod(int x, int y);
我运行以下:
swig -python -o example_wrap.c example.i
gcc -c -arch x86_64 -fPIC example.cxx -o example.o -I/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7
ld -bundle -macosx_version_min 10.13 -flat_namespace -undefined suppress -o _example.so *.o
所有这些都正确地创建了 _example.so、example_wrap.c、example.o 和 example.py。
那我运行python2.7
import example
然后我得到
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "example.py", line 17, in <module>
_example = swig_import_helper()
File "example.py", line 16, in swig_import_helper
return importlib.import_module('_example')
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
ImportError: dynamic module does not define init function (init_example)
有什么想法吗?
我解决了:
Swig -python example.i
Gcc -fPIC -c example.c
gcc -fPIC -c example_wrap.c -I/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7/
gcc -dynamiclib -o _example.so *.o -L/usr/lib/ -lpython2.7 -flat_namespace
这里重要的是-flat_namespace。不知道为什么。
我也遇到了这个问题,但是我想使用我的 Python 3.8(已安装 env)
项目 .
这个项目的布局是...
布局
/setup.py
/example.i
/example.h
/example.c
/Makefile.mak
代码清单
example.h
/* File: example.h */
int fact(int n);
example.i
/* File: example.i */
%module example
%{
#define SWIG_FILE_WITH_INIT
#include "example.h"
%}
int fact(int n);
Makefile.mak
obj = example_wrap.c _example.so
.PHONY: all
all : $(obj)
clean:
rm -f *.o
rm -f *.so
rm -f *wrap*.c*
rm -Rf build
example_wrap.c : example.i
swig -python example.i
_example.so: example.i
python setup.py build_ext --inplace
test:
python -c "from _example import fact; print(f'Fact 10 is {fact(10)}')"
example.c
/* File: example.c */
#include "example.h"
int fact(int n) {
if (n < 0){ /* This should probably return an error, but this is simpler */
return 0;
}
if (n == 0) {
return 1;
}
else {
/* testing for overflow would be a good idea here */
return n * fact(n-1);
}
}
setup.py
#!/usr/bin/env python
"""
setup.py file for SWIG example
"""
from distutils.core import setup, Extension
example_module = Extension('_example',
sources=['example_wrap.c', 'example.c'],
)
setup (name = 'example',
version = '0.1',
author = "SWIG Docs",
description = """Simple swig example from docs""",
ext_modules = [example_module],
py_modules = ["example"],
)
建设
- 切换到您的 Python 环境
- 制作
- 进行测试
应该是这样。
希望对某人有所帮助。
我正在尝试在 OSX.
中使用 SWIG 为某些 C++ 代码编译一个 python 包装器的最小示例/* File : example.c */
double My_variable = 3.0;
int fact(int n) {
if (n <= 1) return 1;
else return n*fact(n-1);
}
int my_mod(int x, int y) {
return (x%y);
}
和接口文件:
/* example.i */
%module example
%{
/* Put header files here or function declarations like below */
extern int fact(int n);
extern int my_mod(int x, int y);
%}
extern int fact(int n);
extern int my_mod(int x, int y);
我运行以下:
swig -python -o example_wrap.c example.i
gcc -c -arch x86_64 -fPIC example.cxx -o example.o -I/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7
ld -bundle -macosx_version_min 10.13 -flat_namespace -undefined suppress -o _example.so *.o
所有这些都正确地创建了 _example.so、example_wrap.c、example.o 和 example.py。 那我运行python2.7
import example
然后我得到
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "example.py", line 17, in <module>
_example = swig_import_helper()
File "example.py", line 16, in swig_import_helper
return importlib.import_module('_example')
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
ImportError: dynamic module does not define init function (init_example)
有什么想法吗?
我解决了:
Swig -python example.i
Gcc -fPIC -c example.c
gcc -fPIC -c example_wrap.c -I/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7/
gcc -dynamiclib -o _example.so *.o -L/usr/lib/ -lpython2.7 -flat_namespace
这里重要的是-flat_namespace。不知道为什么。
我也遇到了这个问题,但是我想使用我的 Python 3.8(已安装 env)
项目 .
这个项目的布局是...
布局
/setup.py
/example.i
/example.h
/example.c
/Makefile.mak
代码清单
example.h
/* File: example.h */
int fact(int n);
example.i
/* File: example.i */
%module example
%{
#define SWIG_FILE_WITH_INIT
#include "example.h"
%}
int fact(int n);
Makefile.mak
obj = example_wrap.c _example.so
.PHONY: all
all : $(obj)
clean:
rm -f *.o
rm -f *.so
rm -f *wrap*.c*
rm -Rf build
example_wrap.c : example.i
swig -python example.i
_example.so: example.i
python setup.py build_ext --inplace
test:
python -c "from _example import fact; print(f'Fact 10 is {fact(10)}')"
example.c
/* File: example.c */
#include "example.h"
int fact(int n) {
if (n < 0){ /* This should probably return an error, but this is simpler */
return 0;
}
if (n == 0) {
return 1;
}
else {
/* testing for overflow would be a good idea here */
return n * fact(n-1);
}
}
setup.py
#!/usr/bin/env python
"""
setup.py file for SWIG example
"""
from distutils.core import setup, Extension
example_module = Extension('_example',
sources=['example_wrap.c', 'example.c'],
)
setup (name = 'example',
version = '0.1',
author = "SWIG Docs",
description = """Simple swig example from docs""",
ext_modules = [example_module],
py_modules = ["example"],
)
建设
- 切换到您的 Python 环境
- 制作
- 进行测试
应该是这样。
希望对某人有所帮助。