首页 > 解决方案 > 在 python 代码中处理来自 C 库的对象

问题描述

我想将一个 C/C++ 库从一个文件实现为 Python 脚本,以控制HBM 称为 ClipX.dll的 I/O 设备(以防将来有人需要帮助)。

制造商提供了一个示例 C 实现和一个示例 C++ 实现。在 C 示例中,Connect() 函数返回一些指针,该指针用于后续的读/写函数。在 C++ 示例中,ClipX 类用于建立连接,而读/写函数是该类中的方法。出于这个问题的目的,我已经简化了代码。

基本上,我想使用connect()该设备,然后再read()使用它。从我读过的内容来看,Cython 似乎是包装connect()read()作为单独函数并将它们作为模块导入 Python 的好方法。我的问题是:

  1. 对于 C 实现,我是否能够在连接后将 MHandle 指针传回 Python 以供以后使用(即调用 read 函数)?指针是否有任何意义,稍后在不同的函数调用中使用?

  2. 对于 C++ 实现,是否可以将 dev 对象传递给 Python 代码,以便稍后传回Read()? 你可以用任意对象做到这一点吗?

我是一名机械工程师,如果这是胡言乱语或完全不了解情况,请见谅。非常感谢任何指导。

C代码:

/*From .h file*/
----------------------------------------------------
struct sClipX {
void *obj;
};

typedef struct sClipX * MHandle;
ClipX_API MHandle __stdcall Connect(const char *);
----------------------------------------------------
/*End .h file*/

int main()
{
    const char * IP = "172.21.104.76";
    MHandle m=Connect(IP);
    Read(m, 0x4428);
}

C++ 代码:

int main(){
    ClipX  dev = ClipX();
    dev.Connect("172.21.104.76");
    dev.Read(0x4428);

标签: pythonc++cythonporting

解决方案


如果将 C++ 函数声明为 extern "C". 这与名称修饰有关

Python 解释器可以使用 C 函数进行扩展。仔细阅读扩展和嵌入 Python 解释器一章。

小心 C++ 异常。您不希望它们跨越 Python 解释器代码。因此,从 Python 调用的任何extern "C" C++ 函数都应该处理和捕获内部例程引发的异常。

最后,注意内存管理和垃圾收集。P.Wilson 关于单处理器垃圾收集技术的旧论文是相关的,至少对于术语和见解而言。或阅读GC 手册。Python 使用引用计数方案并特别处理弱引用。小心循环引用

当然要注意 Python 中的GIL。粗略地说,你不能让多个线程在没有预防措施的情况下做 Python 的事情。

设备相关数据的序列化也是一个问题,但您可能不需要它。

最重要的是,记录好您的代码

doxygen这样的工具可能会有所帮助(可能使用LaTeXDocBook)。

当然使用足够好的版本控制系统。我推荐git。也是一个很好的构建自动化工具。

我的建议是将您的 C++ 代码作为开源发布,例如在githubgitlab上。然后,您可以获得有用的代码审查和反馈。

如果您的硬件 + 软件系统对安全至关重要,请考虑使用静态程序分析技术,例如使用Frama-CClang 静态分析器或使用您自己的GCC 插件。几个月后(2020 年底),您可能会尝试Bismon(另请阅读此报告草案)。

我肯定有偏见,但我确实建议尝试一些Linux 发行版(例如UbuntuDebian)作为您的交叉开发平台。请注意,许多设备(包括RaspBerryPi)都在运行一些嵌入式 Linux 系统,因此学习努力是有意义的。然后阅读高级 Linux 编程


推荐阅读