无法将 'vector<unsigned long>' 转换为 Python 对象

Posted

技术标签:

【中文标题】无法将 \'vector<unsigned long>\' 转换为 Python 对象【英文标题】:Cannot convert 'vector<unsigned long>' to Python object无法将 'vector<unsigned long>' 转换为 Python 对象 【发布时间】:2011-03-16 15:50:46 【问题描述】:

我正在尝试用签名包装一个 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

但我收到此“无法将 'vector' 转换为 Python 对象”错误。我错过了什么吗?

解决方案:我必须从我的 OES 函数中返回一个 python 对象:

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】:

如果您只需要为 C++ 调用函数,请使用 cdef 而不是 def 声明它。

另一方面,如果您需要从 Python 调用它,您的函数必须返回一个 Python 对象。 在这种情况下,您可能会让它返回一个 Python 整数列表。

【讨论】:

巴斯蒂安,你说得对。我是 python 与 C/C++ 结合领域的菜鸟。我已经编辑了我的问题以显示解决方案。

以上是关于无法将 'vector<unsigned long>' 转换为 Python 对象的主要内容,如果未能解决你的问题,请参考以下文章

Swig:将 std::vector<unsigned char> 传递给从 c++ 生成的 c# 函数

从 vector<unsigned char> 转换为 char* 包括垃圾数据

将 int 转换为 unsigned long long

如何使用多次 memcpy 转换回 std::vector<unsigned char>?

使用 std::vector<unsigned char> 的内容初始化结构

将二进制文件读取到“unsigned char”向量时的模板参数是啥