windows下用swig实现python调用C\C++的方法

时间:2022-09-29 10:22:54

用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.")