如何从Python接收C结构体

2 投票
1 回答
502 浏览
提问于 2025-04-17 08:45

我有一个独立的Python模块,用来分析一些原始数据。这个模块运行得非常好。

现在我需要把这个Python模块生成的输出结果放到C语言的代码里,以便对这些输出进行进一步处理。

大致的流程是这样的:

  1. C语言代码会调用这个Python模块。
  2. Python模块会把生成的结果填充到一个C语言的结构体中,然后以某种方式把它传递给C语言代码。

那么,怎样才能在C语言代码中获取Python模块的结果呢?

我是不是可以用下面这样的方式来填充结果呢?

from ctypes import *
class result(Structure):       
    _fields_ = [("status", c_int), ...]

1 个回答

3

我觉得你可能不想使用ctypes模块——这个模块是用来从Python代码访问DLL和共享对象的,而不是反过来。

你没有说明C程序是怎么调用Python模块的。它会:

  • 用类似popen的方式从C调用Python脚本吗?如果是这样的话,你可以在Python中把数据写入stdout,然后在C中适当地解析这些数据。你需要自己设计一个小协议来处理这个。这个协议可以是临时的,或者你可以使用现有的格式,比如JSON,C和Python都有相关的库可以使用。

  • 把Python虚拟机嵌入到你的C程序中吗?那样的话,你需要把C中的值转换成合适的Py*值,并放入一个PyTuple中,这样你就可以从C传递给Python函数作为参数。Python函数的输出会是一个PyObject,你需要在C中解包它才能获取数据。

在这两种情况下,你都需要自己处理打包和解包的过程。

撰写回答