我仍然很难解决这个问题。在名为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


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

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)


无论我如何尝试导入它,我都会得到“未定义PythonFoo”(因为我猜测pxd文件中没有init),或者我必须手动包含Foo.pyx,这使其现在成为Bar的成员。

有人可以告诉我(请举个例子)这应该如何工作吗?

谢谢。

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

在Python测试器中,我尝试使用它

import PythonFoo
import PythonBar

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


这是我得到的“没有名为“ PyFoo”的模块

最佳答案

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

我用一个简单的方法解决了

sys.path.append('package_directory')

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

关于python - 如何将C++指针传递给其他cython对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40383112/

10-10 21:25