通过SWIG封装C/C++代码被Python调用
2014-02-28 13:45
519 查看
1.介绍
SWIG将C代码做成各种脚本语言的扩展模块(Python,Perl,Tcl等。SWIG本质上是一个编译器,它可以通过C/C++的头文件或者一个特殊的接口文件来生成一个以_wrapc为后缀的包装文件,例如你的C模块叫 test.c, 那么SWIG会为你生成一个test_wrapc文件,然后将这两个文件编译成一个动态链接库,就能使用其它的脚本语言来调用。
2.环境配置
python 2.7 + SWIG 2.0.12
3.Demo
1)下载并安装SWIG 2.0.12版本(http://swig.org/), Python 2.7 版本.
并将C:\swigwin-2.0.12, c:\Python27 添加到环境变量Path中。
2)代码:
foo.h:
extern void hello(void);
foo.c:
#include <stdio.h>
#include "foo.h"
void hello(void)
{
printf("Hello world!\n");
}
foo.i:
%module foo
%include "foo.h"
3)编译:
step 1: 调用swig生成wrapper, foo_wrap.c和foo.py(swig -python foo.i)
step 2: 使用vc的编译器进行编译目标文件。
打开VS -> Tools -> Visual Studio 2005 Command Prompt,定位到foo.c所在目录。
cl /Fe_foo.pyd /LD foo.c foo_wrap.c c:\Python27\libs\python27.lib /Ic:\Python27\include
生成的foo.py和_foo.pyd择其一即可正常调用。
step 3: 在当前目录下运行python命令行进行测试。
>> import foo
>> foo.hello()
4.注意事项
对于将要打包的C/C++代码,只有.h和.i文件时不够的,必须有.c/.cpp源代码,也就是说对于非自己生成的DLL库,是不能直接通过头文件生成.pyd库的。(但是我们可以加一层调用,这样的话就可以,但是通用性比较成问题,当外部DLL库导出符号发生变化的时候,中间层必须同时变化,维护是一场灾难。)
参见文章: /article/9943168.html
SWIG将C代码做成各种脚本语言的扩展模块(Python,Perl,Tcl等。SWIG本质上是一个编译器,它可以通过C/C++的头文件或者一个特殊的接口文件来生成一个以_wrapc为后缀的包装文件,例如你的C模块叫 test.c, 那么SWIG会为你生成一个test_wrapc文件,然后将这两个文件编译成一个动态链接库,就能使用其它的脚本语言来调用。
2.环境配置
python 2.7 + SWIG 2.0.12
3.Demo
1)下载并安装SWIG 2.0.12版本(http://swig.org/), Python 2.7 版本.
并将C:\swigwin-2.0.12, c:\Python27 添加到环境变量Path中。
2)代码:
foo.h:
extern void hello(void);
foo.c:
#include <stdio.h>
#include "foo.h"
void hello(void)
{
printf("Hello world!\n");
}
foo.i:
%module foo
%include "foo.h"
3)编译:
step 1: 调用swig生成wrapper, foo_wrap.c和foo.py(swig -python foo.i)
step 2: 使用vc的编译器进行编译目标文件。
打开VS -> Tools -> Visual Studio 2005 Command Prompt,定位到foo.c所在目录。
cl /Fe_foo.pyd /LD foo.c foo_wrap.c c:\Python27\libs\python27.lib /Ic:\Python27\include
生成的foo.py和_foo.pyd择其一即可正常调用。
step 3: 在当前目录下运行python命令行进行测试。
>> import foo
>> foo.hello()
4.注意事项
对于将要打包的C/C++代码,只有.h和.i文件时不够的,必须有.c/.cpp源代码,也就是说对于非自己生成的DLL库,是不能直接通过头文件生成.pyd库的。(但是我们可以加一层调用,这样的话就可以,但是通用性比较成问题,当外部DLL库导出符号发生变化的时候,中间层必须同时变化,维护是一场灾难。)
参见文章: /article/9943168.html
相关文章推荐
- swig 把c/c++ 封装成python可调用的so文动态链接库
- 使用swig在python中调用c++代码
- 高效开发Python扩展模块方法:用SWIG封装C/C++代码
- 利用Swig在python中调用C/C++代码
- swig 把c/c++ 封装成python可调用的so文动态链接库
- python通过swig调用c++dll时指针的用法
- 高效开发Python扩展模块方法:用SWIG封装C/C++代码
- 使用SWIG实现Python调用C/C++代码
- python下面通过ctypes模块调用c++库的方法
- PY++ 自动将你的C++程序接口封装供python调用
- Android(安卓)开发通过NDK调用JNI,使用opencv做本地c++代码开发配置方法 边缘检测 范例代码
- Windows C++程序调用包含TensorFlow代码的Python脚本出错问题的解决办法
- C++通过DLL调用C#代码
- Android NDK项目中使用SWIG生成JAVA类和C/C++封装代码
- centos中使用swig实现python调用c++
- 利用Boost.Python将C++代码封装为Python模块
- unity3D C#调用C++代码(通过DLL链接库方式)
- python调用c++代码,.so库的编译
- 如何让python调用C和C++代码
- python下面通过ctypes模块调用c++库的方法