【问题标题】:How to pass C++ pointers to to other cython objects如何将 C++ 指针传递给其他 cython 对象
【发布时间】: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吗?

标签: python c++ cython


【解决方案1】:

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

我用一个简单的方法修复了它

sys.path.append('package_directory')

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

【讨论】:

  • 我不明白将__init__.pysetup.py 放在同一目录中可能是个问题……但添加包目录对于cimport 来说肯定很重要。跨度>
  • 这是因为在这个特定示例中名称没有限定。
猜你喜欢
  • 1970-01-01
  • 2023-03-27
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
  • 2019-11-25
  • 2019-02-07
  • 2020-09-14
  • 2022-01-08
相关资源
最近更新 更多