【发布时间】:2016-11-02 14:57:20
【问题描述】:
我仍然很难弄清楚这一点。以这个简单的场景.. 在一个名为 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)
无论我如何尝试 cimport 它,我都会得到“PythonFoo not defined”(因为我猜 pxd 文件中没有 init)或者我必须手动包含 Foo.pyx,使其成为 Bar 的成员。
谁能告诉我(请举个例子)这应该如何工作?
谢谢。
编辑:PythonFoo 和 PythonBar 在包中的单独模块中。
在 Python 测试器中,我尝试使用它
import PythonFoo
import PythonBar
foo=PythonFoo()
bar=PythonBar()
bar.SomeFunction(foo)
这是我得到“没有名为 'PyFoo' 的模块”的地方
【问题讨论】:
-
您在 pyx 中有
PyFoo并在 pxd 中有Foo是错字吗?另外,"You don’t need to (and shouldn’t) declare anything in a declaration file public in order to make it available to other Cython modules" - 改为导入模块 pyFoo。 -
是的,这是一个错字,但我希望这个问题仍然有意义。问题是,如果我没有在 pxd 文件中放入任何内容,那么当我尝试将 pyFoo 导入 pyBar 时,对此一无所知。如果我把前向声明放到Foo.pxd中,那么我可以导入pyFoo,但是在尝试运行python程序时,错误是“找不到模块pyFoo。我调整了上面的例子来进一步说明。
-
问题是我无法导入模块,我也试过了。假设 PythonFoo 在一个目录中(来自“.”)Interfaces/Stuff,而 PythonBar 在一个目录中(来自“.”)Interfaces/OtherStuff。我总是收到错误“PythonFoo 不是 cimported 模块”...
-
@MattOstlund 不应该是
from PyFoo cimport PythonFoo吗?