在Windows中为python编译SWIG包装器

时间:2013-10-22 15:38:38

标签: c++ python windows numpy swig

首先,感谢大家在过去几年中在这个论坛上给你的所有答案,但是今天我找不到一个明确的答案,所以我觉得是时候发帖了。

我设法在我的Debian发行版上编译并运行C ++代码test5.cpp,将它(可能不是正确的单词)包装到带有SWIG的python模块Amod.py中(需要“翻译”)文件test5.i。我使用并成功导入数据分析模块到其他更复杂的python代码(基本上操作numpy数组,matplotlib等等。)。

现在我想在Windows计算机上运行相同的代码但是python不能再导入模块了,librairy文件_Amod.so是一个.so文件,而不是Windows期望的.pyd。但我找不到一种快速简便的方法在Windows上重新编译它。我挖掘CodeBlocks文档,但它的缺点,我迷失了。 (http://wiki.codeblocks.org/index.php?title=Adding_support_for_non_C/C%2B%2B_files_to_the_build_system

基本上我想运行Windows等效的下面的工作代码(我希望可以帮助初学者是SWIG):

编译:

swig -c++ -python test5.i
g++ -fPIC -c test5.cpp
g++ -fPIC -c test5_wrap.cxx -I/usr/include/python2.7
g++ -shared test5.o test5_wrap.o -o _Amod.so

我应该使用哪种软件和编译器,以及如何使用,而不会浪费我的时间? (我已经获得了CodeBlocks)非常感谢你。

如果需要的话,test5.i如下所示,将C ++数组包装在numpy数组中,添加一些内联(替换函数)用于检查目的(所有这些都是用血液和眼泪挖掘swig帮助):

/* %module module_name is used in compilation as: g++ -shared main.o main_wrap.o -o _module_name.so (with the underscore)*/
%module Amod

%{
/* Put header files here or function declarations like below. The #define SWIG_FILE_WITH_INIT line inserts a macro that specifies that the resulting C file should be built as a python extension, inserting the module init code. check http://www.swig.org/Doc1.3/Python.html#Python_nn3 */
#define SWIG_FILE_WITH_INIT
#include "test5.h"
%}

/* numpy.i and import_array() allow SWIG to manipulate C++ pointer (like double* ivec) like numpy array, because SWIG doesn't know a priori, that the pointer refer to an array. check http://docs.scipy.org/doc/numpy/reference/swig.interface-file.html */

%include "numpy.i"

%init %{
import_array();
%}


/* C++ function arg must fits the typemap directives available in numpy.i. */

%apply (int DIM1, double* INPLACE_ARRAY1) {(int len1, double* ivec),(int len2, double* ovec),(int len3, double* gauss)};
%rename (abel) abel_swig;
%exception abel_swig {
    $action
    if (PyErr_Occurred()) SWIG_fail;
}
%inline %{
void abel_swig(int len1, double* ivec, int len2, double* ovec, int algo, double alpha) {
    if (len1 != len2) {
        PyErr_Format(PyExc_ValueError,"Arrays of lengths (%d,%d) given",len1, len2);
        return;
    }
    memset(ovec, 0, len1*sizeof(double));
    return abel(len1, ivec, len2, ovec, algo, alpha);
}
%}


%rename (convol_gauss) convol_gauss_swig;
%exception convol_gauss_swig {
    $action
    if (PyErr_Occurred()) SWIG_fail;
}
%inline %{
void convol_gauss_swig(int len1, double* ivec, int len2, double* ovec, int len3, double* gauss) {
    if ((len1 != len2)||(len1 != len3)) {
        PyErr_Format(PyExc_ValueError,"Arrays of lengths (%d,%d,%d) given, they must be the same",len1, len2, len3);
        return;
    }
    memset(ovec, 0, len1*sizeof(double));
    return convol_gauss(len1, ivec, len2, ovec, len3, gauss);
}
%}


/* Put header files here or function declarations like below */

%include "test5.h"

和标题test5.h

#ifndef TEST5_H_INCLUDED
#define TEST5_H_INCLUDED
#include <cstring>
#include <iostream>
#include <cmath>
void convol_gauss(int size, double* ivec, int size2, double* ovec, int size3, double* gauss);
void abel(int len1, double* ivec, int len2, double* ovec, int algo);

#endif // TEST5_H_INCLUDED

1 个答案:

答案 0 :(得分:1)

好的,我设法做到了。

1-注意你.i文件是用utf-8编码的,因为如果Python作为不同的编码,它会阻止swig编译。(#error Must use Python with unicode enabled

2-在www.swig.org上下载swig for Windows并安装MinGW

cmd或Powershell中的3-类型

swig -c++ -python test5.i
g++ -c -Wall test5.cpp
g++ -c -Wall test5_wrap.cxx -I C:\Python27\include -I C:\Python27\Lib\site-packages\numpy\core\include\
g++ -Wall -shared -I C:\Python27\include -I C:\Python27\Lib\site-packages\numpy\core\include\ test5.o test5_wrap.o -o _Amod.pyd -L C:/Python27/libs/ -lpython27

-I C:\Python27\Lib\site-packages\numpy\core\include\解决错误: fatal error : numpy\arrayobject.h no such file or directory

-L C:/Python27/libs/ -lpython27解决错误: undefined reference to _imp__Py...

与Linux编译相反,库C:/Python27/libs/python27.lib必须仔细链接,以及标题的直接存储(C:\ Python27 \ include和numpy C:\ Python27 \ LIB \站点包\ numpy的\核心\包括) 希望它能有所帮助,但我不觉得这是一项非常干净的工作。考虑到我遇到的错误,请参阅this previous post