簡體   English   中英

在Cython中調用外部c ++模板函數

[英]Calling external c++ template functions within Cython

我在c ++頭文件中聲明並實現了許多c ++模板函數,我想訪問Cython中的一些函數。

假設c ++代碼在header.hpp ,如下所示

template <class T> 
T doublit(T& x) {
    return 2*x;
}

我需要在.pyx文件和setup.py文件中編寫什么才能在Python中使用該函數

>>> import modname
>>> print modname.doublit(3)
6

PS:是否可以在PYPY中訪問相同的功能? 如果是的話,怎么樣?


謝謝你的幫助。 但是當我試圖按照你的方式行事時,我還有其他困難(下面)。

doublit.h

template <class T> 
T doublit(T& x) {
   return 2*x;
}

cdoublit.pxd

cdef extern from "doublit.h":
    cdef int doublit1 "doublit<int>"(int& foo)
    cdef double doublit2 "doublit<double>"(double& foo)

doublit.pyx

# main.pyx file
from cdoublit cimport *

cdef int n1 = 5
cdef double n2 = 5.0
print(doublit1(n1))
print(doublit2(n2))

和setup.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

ext_modules = [Extension("doublit", ["doublit.pyx"])]

setup(
 name = 'Learning Cython',
 cmdclass = {'build_ext': build_ext},
 ext_modules = ext_modules
)

最后,我建立了

>>> python setup.py build_ext --inplace

但我得到以下異常:

###:doublit markma$ python setup.py build_ext --inplace
running build_ext
cythoning doublit.pyx to doublit.c
building 'doublit' extension
creating build
creating build/temp.macosx-10.6-intel-2.7
gcc-4.2 -fno-strict-aliasing -fno-common -dynamic -isysroot /Developer/SDKs/MacOSX10.6.sdk -arch i386 -arch x86_64 -g -O2 -DNDEBUG -g -O3 -I/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -c doublit.c -o build/temp.macosx-10.6-intel-2.7/doublit.o
In file included from doublit.c:311:
doublit.h:1: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘<’ token
doublit.c: In function ‘initdoublit’:
doublit.c:782: error: ‘doublit’ undeclared (first use in this function)
doublit.c:782: error: (Each undeclared identifier is reported only once
doublit.c:782: error: for each function it appears in.)
doublit.c:782: error: expected expression before ‘int’
doublit.c:793: error: expected expression before ‘double’
In file included from doublit.c:311:
doublit.h:1: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘<’ token
doublit.c: In function ‘initdoublit’:
doublit.c:782: error: ‘doublit’ undeclared (first use in this function)
doublit.c:782: error: (Each undeclared identifier is reported only once
doublit.c:782: error: for each function it appears in.)
doublit.c:782: error: expected expression before ‘int’
doublit.c:793: error: expected expression before ‘double’
lipo: can't figure out the architecture type of: /var/folders/ip/ip5rkteZFbWPEtzhmxRdVE+++Tc/-Tmp-//ccvaEGqZ.out
error: command 'gcc-4.2' failed with exit status 1

Cython支持模板語法,但僅適用於類(從Cython 0.19.1開始)。

雖然您可以使用以下語法包裝模板函數:

# doublit.pxd file
cdef extern from "doublit.h":
    cdef int doublit1 "doublit<int>"(int& foo)
    cdef double doublit2 "doublit<double>"(double& foo)

# main.pyx file
from doublit cimport *
cdef int n1 = 5
cdef double n2 = 5.0
print(doublit1(n1))
print(doublit2(n2))

你失去了自動化,但至少你可以使它工作。

UPDATE

Cython 0.20增加了對調用C ++模板函數的支持。 Cython 0.20測試版發布

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM