将python列表传递给“ c” DLL函数,该函数使用ctypes返回数组数据

时间:2019-01-11 14:14:58

标签: python ctypes

我想将包含字符串数据的python列表传递到“ c” DLL,DLL处理数据并返回包含整数数据的数组。使用“ ctypes”的python代码和c代码将是什么。我总结如下:

我想从python脚本传递以下数据,例如:

`list=["AO10","AO20","AO30"]` and

我希望DLL代码应返回整数数组,例如

arr={10,20,30}  

我尝试了以下代码,但是程序停止运行而没有提供任何数据

Python脚本

from ctypes import *

mydll = CDLL("C:\\abc.dll")
mydll.sumabc.argtypes = (POINTER(c_char_p), c_int)
list= ["AO10","AO20","AO30"]
array_type = c_char_p * 3
mydll.sumabc.restype = None
my_array = array_type(*a)
mydll.epicsData(my_array, c_int(3))
print(list(my_array))

c DLL

#include "stdafx.h"
#include "myheader.h"

int* epicsData(char *in_data, int size)
{
  for(int i = 1; i < size; i++)
  {
     in_data[i] =i*10;
  }
  return in_data[]
}

2 个答案:

答案 0 :(得分:0)

克里斯蒂法蒂(ChristiFati)的问题comment解决了我的问题:

  

在您设置int*的情况下,您如何期望func返回mydll.sumabc.restype = None。尝试mydll.sumabc.restype = POINTER(c_int)。并且不要忽略函数的返回值。另外,您可以删除https://stackoverflow.com/questions/54134636/using-ctypes-how-to-pass-a-python-list-to-c-dll-function-return-list-array-of-in

答案 1 :(得分:0)

给定的C代码与Python包装器不匹配。函数名称不匹配,类型不匹配。这是一个供您学习的工作示例:

test.c

#include <string.h>

#ifdef _WIN32
#   define API __declspec(dllexport)  // Windows-specific export
#else
    define API
#endif

/* This function takes pre-allocated inputs of an array of byte strings
 * and an array of integers of the same length.  The integers will be
 * updated in-place with the lengths of the byte strings.
 */
API void epicsData(char** in_data, int* out_data, int size)
{
    for(int i = 0; i < size; ++i)
        out_data[i] = (int)strlen(in_data[i]);
}

test.py

from ctypes import *

dll = CDLL('test')
dll.epicsData.argtypes = POINTER(c_char_p),POINTER(c_int),c_int
dll.epicsData.restype = None

data = [b'A',b'BC',b'DEF'] # Must be byte strings.

# Create the Python equivalent of C 'char* in_data[3]' and 'int out_data[3]'.
in_data = (c_char_p * len(data))(*data)
out_data = (c_int * len(data))()

dll.epicsData(in_data,out_data,len(data))
print(list(out_data))

输出:

[1, 2, 3]