Невозможно преобразовать векторк объекту Python - PullRequest
6 голосов
/ 16 марта 2011

Я пытаюсь обернуть функцию c ++ подписью

vector < unsigned long > Optimized_Eratosthenes_sieve(unsigned long max)

, используя Cython.У меня есть файл sieve.h, содержащий функцию, статическая библиотека sieve.a, и мой setup.py выглядит следующим образом:

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
)

В моем sieve.pyx я пытаюсь:

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

но я получаю эту ошибку "Не удается преобразовать вектор" в объект Python ".Я что-то упустил?

РЕШЕНИЕ: Я должен вернуть объект python из моей функции 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

1 Ответ

2 голосов
/ 24 марта 2011

Если вам нужно только вызвать функцию для C ++, объявите ее с cdef вместо def.

С другой стороны, если вам нужно вызвать его из Python, ваша функция должна вернуть объект Python. В этом случае вы, вероятно, сделаете так, чтобы он возвращал список целых чисел в Python.

...