2

まず、ここ数年、このフォーラムで私に提供してくれたすべての回答に感謝しますが、今日は明確な回答を見つけることができなかったので、投稿する時が来たと思いました.

test5.cpp私はDebianディストリビューションでC++コードをコンパイルして実行し、それを(おそらく正しい言葉ではない) Amod.pySWIG(「翻訳」ファイルが必要なPythonモジュールにラップします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 配列にラップし、チェック目的でインライン (関数を置換) を追加します (すべて血と涙で 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
4

1 に答える 1