我正在尝试使用签名
包装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
答案 0 :(得分:2)
如果您只需要为C ++调用函数,请使用cdef
而不是def
声明它。
另一方面,如果你需要从Python调用它,你的函数必须返回一个Python对象。 在这种情况下,您可能会返回一个Python的整数列表。