2011-03-16 13 views
5

Sto cercando di avvolgere una funzione C++ con la firmaImpossibile convertire 'vector <unsigned long>' per Python oggetto

vector < unsigned long > Optimized_Eratosthenes_sieve(unsigned long max) 

utilizzando Cython. Ho un sieve.h file contenente la funzione, un sieve.a libreria statica e la mia setup.py è la seguente:

from distutils.core import setup 
from distutils.extension import Extension 
from Cython.Distutils import build_ext 

ext_modules = [Extension("sieve", 
        ["sieve.pyx"], 
        language='c++', 
        extra_objects=["sieve.a"], 
        )] 

setup(
    name = 'sieve', 
    cmdclass = {'build_ext': build_ext}, 
    ext_modules = ext_modules 
) 

Nel mio sieve.pyx sto provando:

from libcpp.vector cimport vector 

cdef extern from "sieve.h": 
    vector[unsigned long] Optimized_Eratosthenes_sieve(unsigned long max) 

def OES(unsigned long a): 
    return Optimized_Eratosthenes_sieve(a) # this is were the error occurs 

ma Sto ottenendo questo errore "Can not conversion vector to to Python object". Mi sto perdendo qualcosa?

SOLUZIONE: devo restituire un oggetto pitone dalla mia funzione di OES:

def OES(unsigned long a): 
    cdef vector[unsigned long] aa 
    cdef int N 
    b = [] 
    aa = Optimized_Eratosthenes_sieve(a) 
    N=aa.size() 
    for i in range(N): 
     b.append(aa[i]) # creates the list from the vector 
    return b 

risposta

1

Se avete solo bisogno di effettuare una chiamata di funzione per C++, dichiareremo con cdef invece di def.

D'altra parte, se è necessario chiamarlo da Python, la funzione deve restituire un oggetto Python. In questo caso, probabilmente farai ritornare un elenco Python di numeri interi.

+0

Bastien, hai assolutamente ragione. Sono un noob nell'area della combinazione di Python con C/C++. Ho modificato la mia domanda per mostrare la soluzione. – hymloth

Problemi correlati