Как создать оболочку cython для функции c ++ с параметром stl list

Рассмотрим следующий простой код 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 

  • Печатная версия GDB ImportError: нет модуля с именем «принтеры»
  • Как вывести std :: vector <int> как список Python с помощью SWIG?
  • map :: lower_bound () эквивалент для класса dict для python?
  • Почему операции std :: string работают плохо?
  • One Solution collect form web for “Как создать оболочку cython для функции c ++ с параметром stl list”

    В вашем коде есть две основные проблемы.

    Первый заключается в том, что вы используете C ++ в C-файле. Начните с переименования printlist.c в printlist.cpp

    Во-вторых, когда вы определяете сигнатуру вызова для внешней функции, вы используете синтаксис C ++ для объявления функции вместо использования фигурных скобок для шаблонов классов, как описано в http://docs.cython.org/src/userguide/wrapping_CPlusPlus. html # шаблонов . Это то, что вызывает ошибку, которую вы видите. Линия

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

    следует заменить на

     void printlist(list[int] &) 

    Кажется, вы сделали это правильно позже в файле Cython при объявлении нового списка.

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

    printlist.h (Это то же самое, что и у вас)

     #ifndef TESTLIB_H #define TESTLIB_H #include <iostream> #include <list> void printlist(std::list<int> &); #endif 

    printlist.cpp (я только изменил расширение файла и интервал)

     #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;} 

    test.pyx Обратите внимание, что Cython может автоматически конвертировать из списка Python в список C ++. Я делаю это при наборе аргументов для функции list_test . Он также поддерживает некоторые другие типы автоматических преобразований, как указано на http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html#standard-library

     from libcpp.list cimport list cdef extern from "printlist.h": void printlist(list[int] &) def list_test(list[int] l): 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.cpp"], language='c++',)] setup(cmdclass = {'build_ext': build_ext}, ext_modules = ext_modules) 

    test.py Это скрипт Python для вызова функции list_test я добавил в test.pyx .

     from test import list_test list_test([1, 2, 3]) 

    При запуске он должен печатать строку «1 2 3».

    Python - лучший язык программирования в мире.