用swig实现python调用C\C++的方法
本文技术平台:win7,vs2010,python2.7(64位)
1.下载swig
在[www.swig.org]官网上下载相应的安装包,下载后解压安装包到任意路径,注意:路径中最好不要带空格。这样swig便可以使用
2.c++源文件和swig接口文件,文件如下:
example.h
/* example.h */
#ifndef EXAMPLE_H
#define EXAMPLE_H
//void cHelloWorld();
int compute(int a, int b);
#endif
example.cpp
/* example.cpp */
#include <iostream>
#include "example.h"
using namespace std;
int compute(int a, int b)
{
int temp = (a+b)*(a-b);
return temp;
}
example.i(swig接口文件)
/* File : example.i */
%module example
%inline %{
#include "example.h"
%}
int compute(int a,int b);
这里都是c++格式的文件,也可为C语言文件。
3.生成部分文件
将example.h,example.cpp,example.i文件内容复制到txt文件中,改成相应格式,复制到swig文件中。
打开win7下开始—程序—附件—命令提示符
先把swig加入环境变量才能用swig的语句
命令提示符下,进入swig文件,使用’swig -c++ -python example.i‘,生成example_wrap.cxx和example.py两个文件。
如果是C语言的话就是‘swig -python example.i’。
4. 配置Visual Studio 2010
我说一下在VS中的配置方法:
(1)新建项目,选择win32控制台应用程序,在下一步中选择空白项,输出为DLL。
(2)向Header Files中加入example.h,向Source File中加入example.cpp和example_wrap.cxx,向工程中加入example.i,这是可能会弹出一个对话框,我选的是’否’。
(3)然后在VS中project>Properties中点Configuration Manager,设置Configration为Release,Platform为Win32。如果为64位,则选择X64,否则程序会报错。错误如下所示:
error LNK2001: 无法解析的外部符号 __imp__Py_Initialize,该符号在函数 _main 中被引用
(4)下面在包含目录中引入python.h的路径(我的是D:\python27\include), 在库目录中引入python27.lib和python27_d.lib的路径(我的是D:\python27\libs), 如果没有python27_d.lib,就把python27.lib复制一份改个名字。
(5)最后Build Solution,在Release文件夹中会生成example.dll,把它改名成_example.pyd。把example.py,_example.pyd和测试文件放到python文件夹中测试。
可能出现的问题:
如果在vs 200x 下 debug 模式出现链接问题:
extmodule.obj : error LNK2001: unresolved external symbol __imp___Py_Dealloc referenced in function _PySwigObject_format
主要是因为 Py_DEBUG/Py_TRACE_REFS 引起, 修改 Python\include 下的 pyconfig.h, object.h 两个文件就行了
1. 修改 pyconfig.h
修改
#ifdef _DEBUG
# define Py_DEBUG
#endif
为
#ifdef _DEBUG
//# define Py_DEBUG
#endif
修改
# ifdef _DEBUG
# pragma comment(lib,"python24_d.lib")
# else
# pragma comment(lib,"python24.lib")
# endif /* _DEBUG */
为
# ifdef _DEBUG
# pragma comment(lib,"python24.lib")
# else
# pragma comment(lib,"python24.lib")
# endif /* _DEBUG */
2. object.h
修改
#if defined(Py_DEBUG) && !defined(Py_TRACE_REFS)
#define Py_TRACE_REFS
#endif
为
#if defined(Py_DEBUG) && !defined(Py_TRACE_REFS)
// #define Py_TRACE_REFS
#endif
5.python中测试
测试文件:
#!/usr/bin/env python
# -*- coding: cp936 -*-
# runme.py
from __future__ import division
import example
print('this is the test running.\n')
aa = example.compute(5,2)
print aa
raw_input("press the enter key to exit.")