Python 如何为c++;具有stl列表参数的函数 考虑下面的简单C++代码。 (printlist.h)

Python 如何为c++;具有stl列表参数的函数 考虑下面的简单C++代码。 (printlist.h),python,c++,stl,cython,Python,C++,Stl,Cython,我收到的错误消息如下: Error compiling Cython file: ------------------------------------------------------------ ... from libcpp.list cimport list cdef extern from "printlist.h": void printlist(std::list<int> &) ^ --

我收到的错误消息如下:

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
编译Cython文件时出错: ------------------------------------------------------------ ... 从libcpp.list cimport列表 “printlist.h”中的cdef外部: 作废打印列表(标准::列表&) ^ ------------------------------------------------------------ test.pyx:4:27:应为标识符或文字
您的代码有两个主要问题

第一个是在C文件中使用C++。 首先将

printlist.c
重命名为
printlist.cpp

第二个是,当定义外部函数的调用签名时,您使用C++函数语法来代替函数模板,而不是使用类模板的支撑。 这就是导致您看到的错误的原因。 线路

稍后在Cython文件中声明新列表时,您似乎已经正确地执行了这一操作

另一件值得注意的事情是Cython文件不是在编译时执行的。 将测试用例封装在可从Python调用的函数中可能更容易。 下面是一个工作示例

printlist.h
(与您的相同)

test.pyx
请注意,Cython可以从Python列表自动转换为C++列表。 我是在为
list\u test
函数键入参数时这样做的。 它还支持一些其他类型的自动转换,如中所述

setup.py
(我在这里也更改了文件扩展名)

test.py
这是一个Python脚本,用于调用我添加到
test.pyx
中的
list\u test
函数

from test import list_test

list_test([1, 2, 3])
运行时,它应该打印字符串“1 2 3”

 from libcpp.list cimport list

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

 cdef list[int] l = range(10)
 printlist(l)
 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
void printlist(std::list<int> &)
void printlist(list[int] &)
#ifndef TESTLIB_H
#define TESTLIB_H

#include <iostream>
#include <list>

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

#endif
#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;}
from libcpp.list cimport list

cdef extern from "printlist.h":
    void printlist(list[int] &)

def list_test(list[int] l):
    printlist(l)
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)
from test import list_test

list_test([1, 2, 3])