在 Windows 中为 python 编译 SWIG 包装器
Posted
技术标签:
【中文标题】在 Windows 中为 python 编译 SWIG 包装器【英文标题】:Compiling SWIG wrapper for python in Windows 【发布时间】:2013-10-22 15:38:37 【问题描述】:首先,感谢大家过去几年在这个论坛上给我的所有答案,但是今天我找不到明确的答案,所以我认为是时候发帖了。
我设法在我的 Debian 发行版上编译并运行 C++ 代码 test5.cpp
,用 SWIG 将它(可能不是正确的词)包装到 python 模块 Amod.py
中(这需要一个“翻译”文件 test5.i
.我成功地使用并导入了用于数据分析的模块到其他更复杂的python代码中(基本上是操纵numpy数组、matplotlib等..)。
现在我想在 Windows 计算机上运行相同的代码,但 python 无法再导入模块,库文件 _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 数组中,添加一些内联(替换函数)用于检查目的(所有内容都被挖掘到痛饮热血的帮助):
/* %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】:好的,我成功了。
1- 注意你的 .i 文件是用 utf-8 编码的,因为如果 Python 作为不同的编码,它会阻止 swig 编译。(#error Must use Python with unicode enabled
)
2- 在 www.swig.org 上下载 swig for Windows 并安装 MinGW
3- 输入 cmd 或 Powershell
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\库\站点包\numpy\核心\包括) 希望它可以帮助,但我不觉得这是一个非常干净的工作。考虑到我遇到的错误,请参阅this previous post。
【讨论】:
以上是关于在 Windows 中为 python 编译 SWIG 包装器的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows 中为 android 编译 protobuf 2.6.1
如何在 Visual Studio 2017 中为 Windows XP 编译代码
如何在 Linux 或 Windows 中为 OS X 编译?