在Python中使用C++ API - SWIG、重设计或消息传递

4 投票
2 回答
564 浏览
提问于 2025-04-17 01:49

好的,这里有个简单的问题...

我有一个很大的C++ API,基本上是一个套接字的API,使用的是一种顶层的XML协议。这是一个来自某公司的分布式源代码包。所有的源代码都写在头文件里(包括函数的实现),我猜他们觉得这样开发者只需要引入一个H文件就不用担心编译多个cpp文件了吧?这个源代码也有C、Java和.NET版本。

我正在写的应用程序是用Python在Linux上开发的,需要通过Python使用这个API。我的三个选择似乎是:要么让应用程序分别运行,通过消息传递协议进行沟通,要么使用SWIG(或类似工具)生成一个Python的接口,或者把所有源代码重新实现成Python。最终,我希望尽可能地实现异步处理(因为在应用程序的其他部分已经在使用Twisted)。

使用SWIG似乎是最快的选择,但在函数的输入输出和返回值中使用了很多自定义类型的结构,我听说这在SWIG中可能会有点麻烦。

我不太想写一个消息协议,因为那样会增加出错的可能性,还要管理两种不同语言的源代码。把C++代码重新实现成Python可能是个不错的解决方案,但这需要花费大量的时间和精力。

我的问题是,SWIG看起来是个好主意吗?如果是的话,我需要写C++文件来编译这些头文件吗?还是说我应该放弃SWIG,去找其他的方案?

感谢任何帮助或建议。谢谢。

编辑:结果我之前说错了...虽然有很多源代码在头文件里,但我发现还有一堆.lib.a文件。可以在这些文件上使用SWIG、Boost或类似工具吗?还是我需要在这些文件上写一个顶层API再试?到目前为止,我的尝试都失败得很惨。

解决方案:我最后决定直接在Python中实现自己的API。结果发现协议规范并没有那么复杂,而C++库反而让事情变得更复杂。我还额外获得了在异步框架中构建库的好处,而不是在同步调用中处理线程。

2 个回答

3

你可以考虑使用 boost_python。它能让你对 Python 和 C++ 之间的连接有很大的控制权,而且其实使用起来也很简单。网上有一些简单的 教程,可以帮助你了解如何使用 boost_python。因为 boost_python 本身就是 C++ 的一部分,所以你可以避免在项目中引入第三种技术(比如 swig)。

4

对于这种问题,我通常会选择SWIG作为解决方案。它可以很好地处理“自定义类型”的结构。不过,你需要注意的是,如果你的所有内容都放在头文件里,SWIG解析器会有一些限制

撰写回答