2014-07-13 18 views
7

io sono sempre quello che penso è una strana anomalia seg quando sto cercando di passare boost::numpy::ndarray come argomento:Segmentation fault quando si utilizza boost :: :: NumPy ndarray

#include <iostream> 
#include <boost/python.hpp> 
#include <boost/numpy.hpp> 


void say_hello(boost::numpy::ndarray& my_array) 
//void say_hello(int x) This works fine 
{ 
    std::cout<<"Hello"<<std::endl; 
} 

BOOST_PYTHON_MODULE(hello_ext) 
{ 
    using namespace boost::python; 
    def("say_hello", say_hello); 

} 

So che l'esempio è stupido, ma non dovrei avere un difetto di sega lì, e questo è l'esempio più piccolo a cui sono stato in grado di ridurre il problema. Forse ho bisogno di specificare il tipo ndarray o il numero di dimensioni, ma non ho trovato alcuna documentazione su di esso. Stavo guardando this, ma non mi è sembrato molto utile. Il mio istinto è che mi manca qualcosa di semplice, ma semplicemente non lo vedo.

Quando ho eseguito questo:

In [1]: from hello_ext import * 

In [2]: import numpy as np 

In [3]: say_hello(np.array([3,4,5])) 
Segmentation fault (core dumped) 

mio Makefile:

PYTHON_VERSION = 2.7 
PYTHON_INCLUDE = /usr/include/python$(PYTHON_VERSION) 


BOOST_INC = /usr/include 
BOOST_LIB = /usr/lib 

TARGET = hello_ext 

$(TARGET).so: $(TARGET).o 
    g++ -std=c++11 -shared -Wl,--export-dynamic $(TARGET).o -L$(BOOST_LIB) -lboost_python -lboost_numpy -L/usr/lib/python$(PYTHON_VERSION)/config -lpython$(PYTHON_VERSION) -o $(TARGET).so 

$(TARGET).o: $(TARGET).cpp 
    g++ -std=c++11 -I$(PYTHON_INCLUDE) -I$(BOOST_INC) -fPIC -c $(TARGET).cp 

risposta

5

sapevo che era qualcosa di semplice. Avevo bisogno di aggiungere queste due righe:

Py_Initialize(); 
boost::numpy::initialize(); 

come spiegato: here risultati guasto seg dopo ogni tentativo di utilizzare boost::numpy::ndarray se le linee di cui sopra non sono corse.

Pertanto: il mio file diventa:

#include <iostream> 
#include <boost/python.hpp> 
#include <boost/numpy.hpp> 


void say_hello(boost::numpy::ndarray& my_array) 
//void say_hello(int x) This works fine 
{ 
    std::cout<<"Hello"<<std::endl; 
} 

BOOST_PYTHON_MODULE(hello_ext) 
{ 
    using namespace boost::python; 
    Py_Initialize(); 
    boost::numpy::initialize(); 
    def("say_hello", say_hello); 
} 
+0

Ma nell'esempio collegato, l'inizializzazione è fatta in un C++ 'main()'. Qui, siamo in un modulo python. – Walter

Problemi correlati