【发布时间】:2018-03-25 07:54:43
【问题描述】:
我正在尝试使用 Cython 将我的 c++ 类包装到 python 中。我可以创建so文件并在python中导入,但是我的c++类的构造函数被多次调用。
这是我到目前为止所做的。
文件:DBReader.h
#ifndef _DB_READER_H_
#define _DB_READER_H_
#include <iostream>
class DBReader
{
public:
DBReader();
~DBReader();
};
#endif /* _DB_READER_H_ */
文件:DBReader.cxx
#include "DBReader.h"
DBReader::DBReader()
{
std::cout << "Hello\n";
}
DBReader::~DBReader()
{
}
文件:dbreader.pyx
# distutils: language = c++
# distutils: sources = DBReader.cxx
cdef extern from "DBReader.h":
cdef cppclass DBReader:
DBReader() except +
cdef class PyDBReader:
cdef DBReader c_dbreader # hold a C++ instance which we're wrapping
def __cinit__(self):
self.c_dbreader = DBReader()
文件:setup.py
from distutils.core import setup, Extension
from Cython.Build import cythonize
from Cython.Distutils import build_ext
modules = [Extension("dbreader",
sources=["dbreader.pyx", "../DBReader.cxx"],
include_dirs = [".."],
libraries = ["xxxx"],
library_dirs = ["/usr/local/lib64"],
language = "c++")]
setup(ext_modules = modules, cmdclass = {"build_ext" : build_ext})
运行setup.py build_ext --inplace dbreader.so 文件后创建。而且我可以在python中导入。但正如您在下面看到的:Hello 被打印三次。
>>> import dbreader
>>> h = dbreader.PyDBReader()
Hello
Hello
Hello
>>>
【问题讨论】:
-
(将来)您可以检查 Cython 生成的 C++ 代码以尝试查看发生了什么。
cython -a制作了一个带注释的 html 页面,有助于将 C++ 链接到 Cython 代码。构造器机制虽然有点复杂 -
@DavidW 一定会尝试的。谢谢!
标签: python c++ cython distutils cythonize