将 C++ 类与 Python 连接;将非标准类型传递给外部 C

Interfacing C++ Classes with Python; passing non-standard types to extern C

提问人:Woodenplank 提问时间:11/6/2023 更新时间:11/6/2023 访问量:63

问:

违背我自己的最大利益,我开始以“边做边学”的方法学习 C++。

我正在尝试创建一个要在 Python 中导入的 C++ 库 - 具体来说,我已经在 C++ 中实现了一个 Matrix 类来构建面向对象的经验,其想法是利用 C++ 速度进行潜在的繁重数字处理,例如矩阵乘法,但其他方面能够使用 Python 的轻量级语法和丰富的包库。

在这里遵循一个(看似)出色的教程,但是该示例中实现的类和进程仅接受并返回整数,而“extern ”C“ wrapping' 函数也接受并返回整数。 (他们的 Cpp 标头函数)

class myProcessor {
protected:
    int exp;
    int size;

public:
    myProcessor(int exp_in, int size_in);
    int process(double *d, int size);
};

extern "C" {
    unsigned int myProcessorInit(int exp_in, int size_in);
    int myProcessorProcess(unsigned int id, double *d, int size);
} //end extern "C"

对于我的矩阵类,我有成员函数,它们既接受又返回矩阵类对象(例如,矩阵加法将两个矩阵对象加在一起并返回一个新对象),并且类构造函数接受一个向量(并使用 std::vector 逐行存储实际值)。

所以我的问题是,在我进一步讨论这个问题之前,是否可以将向量和对象分类为 Python -> extern “C” -> C++?如果可能的话,它是否可行?喜欢;在肉伤的规模上,“炸掉我的整条腿”,我用这种实现向自己的脚开枪有多糟糕?

我知道vector::d ata可以生成到向量存储其值的实际数组,可以在这里使用吗? 我还制作了一个矩阵设置版本,其中我将输入转换为一维数组;这会更容易移植/连接吗?

p.s. 我知道 Numpy 基本上已经这样做了,但重点是尝试学习如何自己做事。

Python C++ 矩阵

评论

1赞 user4581301 11/6/2023
将适度复杂的类型移入和移出 C++ 的问题在于,两种语言都需要在如何解释这些类型方面达成 100% 的一致性,而 C++ 甚至不能保证在两个 C++ 工具链之间达成一致。例如,有几种符合标准的好方法可以实现,而且它们几乎都被使用了。当协议不是 100% 一致时,您会得到整个腿部损伤的范围。std::string
0赞 molbdnilo 11/6/2023
Python API 完全不知道任何 C++。我认为实现一个实际的 Python 模块而不是弄乱 FFI 接口会是一个更好的主意。
0赞 pptaszni 11/6/2023
要公开自定义类和/或标准库容器,可以使用 github.com/pybind/pybind11 。不知道为什么要使用 .extern C
0赞 user4581301 11/6/2023
vector::data可用于将数据移动到 C++ 之外,只要数组的内容是基元的,保证 的生存期超过指针返回的使用,并且没有任何内容(如由 触发的大小调整)会使所指向的数组无效。vectordatapush_back
0赞 Woodenplank 11/6/2023
目前,我只计划让矩阵保存“double”类型的值。无论如何,至于实现“一个实际的 Python 模块”,你的意思是只在 Python 中编写矩阵类?我可以很容易地做到这一点,但由于C系列语言的速度要快得多,我很想将所有实际的“数字运算”导出到C++。当然,我可能会为自己把这件事复杂化——随心所欲地称其为新手错误或白痴错误。

答: 暂无答案