【发布时间】:2022-01-06 14:09:18
【问题描述】:
这是question 的下一个级别。我需要将 2d C char 数组转换为 Python 列表。
Python 方面
device_info = getInfoFromCpp()
print(device_info.angles)
for angle in device_info.angles:
print("Angel: " + angle)
错误
<Swig Object of type 'char (*)[MaxStringLength]' at 0x000000D8B2710330>
Execution error: 'SwigPyObject' object is not iterable
С++ 标头
struct DeviceInformation {
static const int MaxStringLength= 200;
static const int MaxNumberOfAngles= 5;
char serialNumber[MaxStringLength];
char angles[MaxNumberOfAngles][MaxStringLength];
};
基于@MarkTolonen 的answer,我尝试了以下typemaps,但没有结果。
// %typemap(out) char*[ANY] %{
// %typemap(out) char (*)[ANY] %{
%typemap(out) char [ANY][ANY] %{
PyObject *pyArray = PyList_New(5);
for (uint8_t i = 0; i < 5; ++i) {
PyObject *pyString = PyString_FromString(reinterpret_cast<char*>($1[i]));
PyList_SetItem(pyArray, i, pyString);
}
$result = pyArray;
%}
【问题讨论】:
-
“没有结果”是什么意思?我测试了你的类型图,它对我有用,尽管你应该使用
$1_dim0而不是硬编码的5来获得更通用的类型图的列表长度。 -
另外,PyString 是一个不推荐使用的名称。 SWIG 有一个兼容性#define,但正确的 API 是
PyUnicode_FromString。你也不需要投射,可以说PyUnicode_FromString($1[i])。请注意, PyUnicode_FromString 假定 char 数组以 UTF-8 编码,这可能不正确。 PyBytes_FromString() 只会给出没有编码假设的字节。 -
是的,我也使用
$1_dim0,但是当我尝试 %typemap(out) char*[ANY] 和%typemap(out) char (*)[ANY]时,我硬编码了数组大小。感谢您详细说明PyUnicode_FromString、PyString_FromString和PyBytes_FromString/ 之间的区别
标签: python c++ arrays char swig