gpt4 book ai didi

python - 来自 python,创建数据 block 并通过 SWIG 将其指针传递给 c 程序

转载 作者:行者123 更新时间:2023-11-30 05:07:10 24 4
gpt4 key购买 nike

我几周前才开始学习 Python(菜鸟)。我们正在使用 Python(公司规定的 2.7)作为测试前端,我正在尝试测试一个 C 例程,该例程将一个指针(埋在数据结构中)作为输入参数指向一个二进制数据 block 。我可能做错了很多事情,所以请帮助我理解。

它看起来像 bytearray(size) 生成了一个打包的数据 block ,但如果那是错误的,请告诉我。我还尝试使用 create_string_buffer(size+1),它似乎工作得更好一些。但是我仍然无法让它按照我需要的方式工作。

我们正在使用 SWIG 作为中间人(也是由公司决定的,目前无法更改),这可能是一个复杂的因素。如果有帮助,我可以修改 SWIG 使用的 .i 文件。

关于如何在 SWIG 和 Python 2.7 的约束下实现这一点有什么想法吗?我愿意使用其他包或工具集,只要学习曲线不是非常陡峭(只需要它来实现这一功能)并且它们是免费的(没有额外工具的预算)。

C 数据结构(精简 - 现有代码,无法更改)

typedef struct pb_callback_s pb_callback_t;
struct pb_callback_s
{ void *arg;
};

typedef struct _file_page_type
{ uint32_t page_length; //nominal 256 bytes
pb_callback_t data_ptr_handler;
} file_page_type;

//function prototype
void post_software_management_load(file_page_type file_page);

Python 代码(精简)

myFP = h_api.file_page_type()            #SWIG constructor
dataBlock = bytearray(totalUpdateSize)
#here is where we need to create a pointer to the byte array
#here is where we need to put that info into myFP.data_ptr_handler.arg
h_api.post_software_management_load(myFP)

一些数据点:

-print "myFP.data_ptr_handler.arg", type(myFP.data_ptr_handler.arg)
Results: myFP.data_ptr_handler.arg <type 'NoneType'>
-the function `pointer()` seems to work for `create_string_buffer()` objects, but not for `bytearray()` objects (although both the object and the pointer appear to be of type `ctypes.c_char_Array_257`)
-the function `byref()` works for `create_string_buffer()` objects (results in a type of type `CArgObject` back from `byref()`), but not for `bytearray()` objects

我正在尝试按照这些密切相关的顺序做这些事情:

  1. 获取 Python 脚本以生成与 C 兼容的对象(即连续的二进制数据 block )和
  2. 获取指向它的 C 兼容指针
  3. 将该指针分配给结构并传递给 C 函数(通过 SWIG)

我一直收到“格式不正确的代码”错误,列出了本节中的信息,因此它被移到了上面代码节中的“一些数据点”标签。

最佳答案

最终,我发现尝试将数据从 C 语言转换为 Python 比其值(value)更痛苦。提供 C 接口(interface)的公司向我提供了适当的功能(必要的 C-Pointer-embedded-in-Python),并且有效。很抱歉,因为我已经不在那家公司了,所以不知道助手代码 (C->Py) 到底叫什么。

感谢所有帮助,很抱歉我花了这么长时间才回来回答问题。

关于python - 来自 python,创建数据 block 并通过 SWIG 将其指针传递给 c 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47603920/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com