如何用Cython保持C++类名不变? - c++

我有一个名为Foo的C++类。如果遵循Cython C++ tutorial,则需要以其他方式调用Python类,例如PyFoo。
但是我确实也需要调用Python类Foo。如何有效地做到这一点?

编辑:我正在尝试接口以前与Boost Python接口的现有C++库。由于不同的原因,我想测试Cython。
由于使用Boost:Python调用了Python类,因此它们的名称与C++中的名称相同,因此我想继续使用这种命名约定。以不同的方式调用类并不是Python(CPython)的要求,但至少在本教程中,它似乎是由Cython强加的。

我当然可以使用纯python模块定义一个调用PyFoo的Foo类,但这似乎既无聊又效率低下。

参考方案

有两种方法可以解决此问题。

  • 用备用名称声明C++类;原始名称必须用双引号指定:
    cdef extern from "defs.h" namespace "myns":
        cdef cppclass CMyClass "myns::MyClass":
            ...
    

    然后,您可以将MyClass用于python类,并将C++声明称为CMyClass

    请注意,原始名称必须显式包括名称空间(如果已命名空间)。
    Cython模板参数(如果存在)应放在备用名称声明之后。

  • 在一个单独的.pxd文件中声明您的C++类,该文件的名称与.pyx文件的名称不同,然后使用cimport导入它们。

    在cpp_defs.pxd中:

    cdef extern from "defs.h" namespace "myns":
        cdef cppclass MyClass:
            ...
    

    在py_wrapper.pyx中:

    cimport cpp_defs as cpp
    
    cdef class MyClass:
        cpp.MyClass *_obj
    
  • 在Java中,执行“ ++++++++”表达式,编译器未报告任何错误并且可以正确执行? - java

    我用eclipse编写了这段代码,用war写过,结果为3d。public static void main(String[] args) { double a = 5d + + + + + +-+3d; System.out.println(a); } 参考方案 您的表情可以改写为(5d) + (+ + + + +-+3d) 其中第一个+是应用于两个操作数的…

    在Python和C++之间传输数据而无需写入Windows和Unix文件 - python

    我有预先存在的python和C ++文件,其中python文件定义了许多点,而C ++代码利用其现有库进行了所需的计算。最终产品是C ++代码写入的文件。我正在寻找一种在python中获取2000点列表的方法,将其传递给函数,然后执行所有C ++代码并输出我需要的文件。其他注意事项。这必须是可以在Linux或Windows机器上工作的东西,并且最少安装新插件…

    如何锁定终端运行的perl,obj c,c++,python和ruby等脚本的源代码? - python

    我想出售我在perl,obj c,c ++,python,ruby,bash,php等中制作的脚本等它们都在终端中运行。 (Linux)如何锁定源代码,以便无需人们访问源代码即可分发我的脚本..?换句话说,如何将在Terminal中运行的程序的源代码锁定,以便人们可以使用该程序(如果该代码已下载到他们的Linux机器上,但他们无法访问实际的源代码)?例:ex…

    Python + Selenium:我无法从div获取打印文本 - python

    Python + Selenium:我无法从此div获取打印文本:<div id="modal-content-18" class="modal-content" data-role="content"> <div> SignUp Failed. Please Try Aga…

    SWIG和C++共享库 - c++

    我有一个C++库(我们将其称为mylib)编译为libmylib.so中的/usr/local/lib文件,并且我在my lib中一个名为/usr/local/include的目录中有许多头文件。现在,我想做的(对于初学者而言)只是将其中一个头文件(包含有关我的图书馆提供的类的信息)与SWIG一起使用,以生成mylib_wrap.cxx文件,然后进行编译并将…