gpt4 book ai didi

python - 如何使用 STL 列表参数为 C++ 函数构建 cython 包装器

转载 作者:太空狗 更新时间:2023-10-29 20:41:28 26 4
gpt4 key购买 nike

考虑以下简单的 C++ 代码。(打印列表.h)

#ifndef TESTLIB_H
#define TESTLIB_H

#include <iostream>
#include <list>

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

#endif

(打印列表.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”来声明它?如果没有,使用此功能的最简单方法是什么。

这是我的尝试:

(测试.pyx)

 from libcpp.list cimport list

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

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

(设置.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

最佳答案

您的代码存在两个主要问题。

第一个是您在 C 文件中使用 C++。首先将 printlist.c 重命名为 printlist.cpp

第二个是,当您为外部函数定义调用签名时,您使用 C++ 语法进行函数声明,而不是像 http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html#templates 中描述的那样对类模板使用大括号。 .这就是导致您看到的错误的原因。线路

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

测试.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)

测试.py这是一个 Python 脚本,用于调用我添加到 test.pyx 中的 list_test 函数。

from test import list_test

list_test([1, 2, 3])

运行时,它应该打印字符串“1 2 3”。

关于python - 如何使用 STL 列表参数为 C++ 函数构建 cython 包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21242160/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com