将一段 C++ 代码包装成 Python
Posted
技术标签:
【中文标题】将一段 C++ 代码包装成 Python【英文标题】:Wrapping a piece of C++ code into Python 【发布时间】:2012-03-06 14:54:07 【问题描述】:我有一段生成数据的 C++ 代码。我想将数据公开给 Python。但这并不像听起来那么琐碎……
假设这个 C++ 编译成二进制文件cppcode
。由于框架搭建的方式比较复杂,我只能将代码运行为
./cppcode command line arguments
在 cppcode 内部,它会生成我想从 Python 访问的数据。我知道我是否可以以某种方式将程序重写为
CppClass cpp;
cpp.run( args );
然后我可以用 Boost Python 封装 CppClass,构建一个实例,使用参数运行,并访问生成中的数据。
但现在我只能以./cppcode command line arguments
运行代码
我不能只从 Python 中调用./cppcode
,因为在 ./cppcode 完成后,它的内存将被系统重新收集,我再也无法从 Python 中看到它了。有没有办法解决这个问题?
我能想到:(1)让./cppcode把数据转储到磁盘,让python读取。 (2) 将数据转储到标准输出并通过管道传输到 python 脚本中。但无论哪种方式,我都必须在 Python 中进行一些可能很慢的字符串解析。有没有办法绕过它?
【问题讨论】:
我会先选择(2)
,这应该很简单,因为您可以控制数据的格式。只需以逗号分隔值之类的简单格式输出,可以使用string.split()
快速解析。如果结果太慢,我会考虑使用 Boost Python 之类的东西,这将需要更多的工作来实现。
请通过回馈社区来感谢我们。
@NiklasB.:逗号分隔的值比这更复杂一些,因为它们可能包含包含逗号的字符串。 Python 确实有一个 csv
模块,它可以很好地处理这个问题。
我同意 NiklasB。 Unix 是为管道设计的,而 Python 是为字符串解析而设计的。两者都非常快。编写代码来做到这一点应该不难。我会这样做,如果速度不够快,请考虑使用更快的数据传输方法。
@mathieau:对不起,我不是指完整的 CSV 文件格式...对于简单的数据,您不需要引号转义之类的东西,因此您可以在逗号处拆分。当然,取决于数据的类型。也许如果输出涉及复杂的字符串(或者只是包含逗号的字符串),可以使用另一种分隔符,如\n
来避免问题(当然,假设字符串不包含换行符)。
【参考方案1】:
您可以将 ccpcode 中的 JSON 格式的数据转储到磁盘上,然后简单地使用 python 中的 simplejson 来解析它。这样您就不必编写任何自己的解析器了。
以下是 C++ JSON 模块的一些示例:https://***.com/questions/245973/whats-the-best-c-json-parser
【讨论】:
以上是关于将一段 C++ 代码包装成 Python的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 SWIG 在 C++ API 上生成 C 包装器? [复制]