【问题标题】:Cython c++ module, constructor called multiple timesCython c++ 模块,构造函数多次调用
【发布时间】: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


【解决方案1】:

这一行的问题:

self.c_nodegraph_dbreader = RtlNodeGraphDBReader()

如果你只想要一个默认构造的实例,你已经得到了,没有这行。

通过添加这一行,您明确地构建了第二个这样的实例,然后将其复制到原始实例上,并且……我不确定这一切是如何工作的,但我的猜测是自动生成的副本构造函数第三次调用默认构造函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多