如何将C ++指针传递给其他cython对象

时间:2016-11-02 14:57:21

标签: python c++ cython

我仍然很难搞清楚这一点。在名为PyFoo.pyx

的文件中使用这个简单的场景
cdef extern from "Foo.h" namespace "Foo":  
    cdef cppclass C_FOO:
        ...........

cdef class PythonFoo:
    C_FOO* pythonFoo
    def __cinit__(self):
        self.pythonFoo=new CFOO()

我也有一个PyFoo.PXD,它只是为了一个前向decl这样做,所以其他类可以看到它

cdef class PythonFoo:
    C_FOO * pythonFoo

现在我有另一个需要PythonFoo.pythonFoo作为成员的类(在PyBar.pyx中)

cdef extern from "Bar.h" namespace "Bar":  
    cdef cppclass C_Bar:
         ThisFunctionNeeds(C_FOO*)
cimport PythonFoo        
cdef class PythonBar:
    C_Bar* pythonBar
    def __cinit__(self):
        self.pythonBar=new C_Bar()
    def SomeFunction(self,PythonFoo):
        ThisFunctionNeeds(PythonFoo.pythonFoo)   

无论我如何尝试使用它,我都会得到#Python;未定义的PythonFoo" (因为我猜pxd文件中没有 init )或者我必须手动包含Foo.pyx,使其成为Bar的成员。

有人可以告诉我(请举例说明)这应该如何运作?

谢谢。

编辑:PythonFoo和PythonBar在包中的单独模块中。

在Python测试程序中,我尝试使用此

import PythonFoo
import PythonBar

foo=PythonFoo()
bar=PythonBar()
bar.SomeFunction(foo)

这是我得到的#34;没有名为' PyFoo'

的模块

1 个答案:

答案 0 :(得分:0)

我能够找到它为什么不起作用...模块的实际目录没有放置,事实上,文件放在构建目录的更高目录中。

我用简单的

修复了它

sys.path.append(' package_directory&#39)

编辑:我也发现了为什么这是...我在我的setup.py文件所在的目录中有一个__init__.py,因此编译器认为该目录是该软件包的一部分。我删除了__init__.py,我不再需要附加目录。