2017-05-03 5 views
1

OS:MacOSのシエラ10.12.4SWIGのC++(numpyの付き)のpythonへ:エラー:宣言されていない識別子 'import_array' の使用

Python配布:アナコンダのpython 3.6

私はnumpyのを渡す方法を学んでいますdistutilsを使ってC++に配列します。私が実行したときに

エラーがありますが発生しました:

$ python setup.py build_ext 

エラー:

sample_wrap.cpp:4571:3: error: use of undeclared identifier 'import_array' 
    import_array(); 
^
1 error generated. 

ファイル:sample.i

/* file: sample.i */ 
%module sample 
%{ 
/* include C++ header files necessary to compile the interface */ 
#include "src/sample.h" 
%} 

%include "typemaps.i" 
%include "src/numpy.i" 
%init %{ 
import_array(); 
%} 

%apply (int DIM1, double* IN_ARRAY1) {(int n, double *a), (int m, double *b)}; 
%apply (int DIM1, double* ARGOUT_ARRAY1) {(int size, double *arr)}; 

%include "src/sample.h" 

ファイル:setup.py

# ----- file: setup.py ----- 

from distutils.core import setup, Extension 
import numpy 
import os 

name = "sample" # name of the module 
version = "1.0"  # the module's version number 

os.environ['CC'] = 'g++'; 
os.environ['CXX'] = 'g++'; 

setup(name=name, version=version, 
    ext_modules=[Extension(name='_sample', 
          sources=["sample.i", "src/sample.cpp"], 
          include_dirs=['src',numpy.get_include()], 
          swig_opts=["-c++"] 
          )] 
    ) 

ファイル:src/sample.cpp

/* ----- file: src/sample.cpp ----- */ 

#include <cmath> 
#include "sample.h" 

double dot(int n, double *a, int m, double *b){ 
    double sum = 0.0; 
    for (int i=0; i<n; ++i){ 
     sum += a[i]*b[i]; 
    } 
    return sum; 
} 

void arange(int size, double *arr){ 
    for (int i=0; i<size; ++i) 
    arr[i] = i; 
} 

ファイル:src/sample.h

/* ----- file: src/sample.h ----- */ 

#ifndef SAMPLE_H_ 
#define SAMPLE_H_ 

double dot(int n, double *a, int m, double *b); 
void arange(int size, double *arr); 

#endif // SAMPLE_H_ 

私はGUNのG ++打ち鳴らすないでコンパイルするためには、os.environ['CC'] = 'g++-6'setup.pyos.environ['CXX'] = 'g++-6'os.environ['CC'] = 'g++'os.environ['CXX'] = 'g++'を変更しようとしましたが、依然として同様のエラーが発生する:

sample_wrap.cpp: In function 'PyObject* PyInit__sample()': 
sample_wrap.cpp:4571:16: error: 'import_array' was not declared in this scope 
    import_array(); 
       ^

答えて

0

私はこのdocumentation

/* file: sample.i */ 
%module sample 
%{ 
#define SWIG_FILE_WITH_INIT 
#include "src/sample.h" 
%} 
に基づいて #define SWIG_FILE_WITH_INITを追加しようとするだろう
関連する問題