【发布时间】:2017-04-05 09:29:50
【问题描述】:
我有一个已经包装好的外部类(我的意思是,它可以通过 python 直接访问,无需进一步努力),现在我希望它成为更大的 cython 模块的 part(在换句话说,嵌入它)。
我可以明确地 python 导入它。但问题是外部类已经在 cython 模块中的 extern 函数中使用(因此该类最终在源代码中为 #included)。 Python import 需要编译模块,那么这两个模块可能有同一个类的两个不同副本...
我应该如何在 cython 中使用外部已经包装的类?
(可能过于简单化)示例:
Foo.cpp:
#include "Python.h"
#include "foo.hpp"
struct Foo_wrapper {
PyObject_HEAD
foo bar;
};
static int Foo_init(Foo_wrapper* self, PyObject* args, PyObject*) {
....
}
static PyTypeObject FooType {...};
垃圾邮件.pyx:
cdef extern from "some_functions.hpp":
cdef some_function1(some_type); // this returns a wrapped foo object
def spam(arg1, arg2, arg3):
// wrap arg1, arg2, arg3 to some_type
return some_function1(an_instance_of_some_type); // huh? but foo isn't available here!
我想在spam.pyx 中使用 foo 类。
【问题讨论】:
-
我认为 Python 导入是对的。我认为没有问题,除非两个定义最终不同(即编译模块 1,更改类,编译模块 2)。不过,这个问题可以用一个最小的完整示例来解决。
-
@DavidW,我不认为直接导入是正确的。但如果你这么说,我会试一试。我不认为因为你定义了两个空类 Foo 和 Bar,那么 Foo 与 Bar 是同一个逻辑类,但对解释器来说不是。或者如果你在两个不同的模块中定义了两个同名的类,它们仍然不一样。
-
这就是为什么一些代码的简单示例会有所帮助的原因。我不是 100% 清楚你实际上在做什么!
-
@DavidW,请查看添加的示例。
-
这说明了很多事情。让我考虑一下。