Как построить обертку Cython для функции C ++ с параметром списка stl

Рассмотрим следующий простой код на C ++. (Printlist.h)

#ifndef TESTLIB_H
#define TESTLIB_H

#include <iostream>
#include <list>

void printlist(std::list<int> &);

#endif

(Printlist.c)

#include "printlist.h"

using namespace std;

void printlist(list<int> &l)
  {
  for(list<int>::const_iterator i = l.begin(); i != l.end(); i++)
  cout << *i << ' ';
  cout << endl;
  }

Мой вопрос заключается в том, как использовать этот код с Cython, сложность заключается в том, что printlist принимает stl :: list. Есть ли способ объявить это, используя "extern"? Если нет, то как проще всего использовать эту функцию?

Это моя попытка:

(Test.pyx)

 from libcpp.list cimport list

 cdef extern from "printlist.h":
         void printlist(std::list<int> &)

 cdef list[int] l = range(10)
 printlist(l)

(Setup.py)

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

 ext_modules = [Extension("test", ["test.pyx", "printlist.C"], language='c++',)]

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

Я получаю следующее сообщение об ошибке:

Error compiling Cython file:
------------------------------------------------------------
...
from libcpp.list cimport list

cdef extern from "printlist.h":
        void printlist(std::list<int> &)
                          ^
------------------------------------------------------------

test.pyx:4:27: Expected an identifier or literal

Ответы на вопрос(1)

Ваш ответ на вопрос