How to access to C global variable structure by Python and ctype [duplicate]

牧云@^-^@ 提交于 2019-12-12 09:27:27

问题


I have to integrate python with external so library. Unfortunately, the C code uses a global variable SimpleTest_Y (structure) and I need to access it in order to modify the value(s).

Here the C code

SimpleTest.c file

#include "SimpleTest.h"

/* External inputs (root inport signals with auto storage) */
ExtU_SimpleTest_T SimpleTest_U;

/* External outputs (root outports fed by signals with auto storage) */
ExtY_SimpleTest_T SimpleTest_Y;


/* Model initialize function */
void SimpleTest_initialize(void)
{
  /* external outputs */
  SimpleTest_Y.Out1 = 3.0;
}

SimpleTest.h file

#ifndef SimpleTest_COMMON_INCLUDES_
# define SimpleTest_COMMON_INCLUDES_
#include <stddef.h>
#include <string.h>
#endif                                 

/* External inputs (root inport signals with auto storage) */
typedef struct {
  double In1;                          /* '<Root>/In1' */
  double In2;                          /* '<Root>/In2' */
} ExtU_SimpleTest_T;

/* External outputs (root outports fed by signals with auto storage) */
typedef struct {
  double Out1;                         /* '<Root>/Out1' */
} ExtY_SimpleTest_T;


/* External inputs (root inport signals with auto storage) */
extern ExtU_SimpleTest_T SimpleTest_U;

/* External outputs (root outports fed by signals with auto storage) */
extern ExtY_SimpleTest_T SimpleTest_Y;

/* Model entry point functions */
extern void SimpleTest_initialize(void);

python wrapper

import ctypes

class Inp(ctypes.Structure):
   _fields_ = [('In1', ctypes.c_float),
               ('In2', ctypes.c_float)]

class Out(ctypes.Structure):
   _fields_ = [('Out1', ctypes.c_float)]               


myLib = ctypes.CDLL('./SimpleTest.so')

#Initialize
SimpleTest_initialize = myLib.SimpleTest_initialize
SimpleTest_initialize()



#Output
SimpleTest_Y = myLib.SimpleTest_Y
SimpleTest_Y.restype = ctypes.POINTER(Out)

#print type(SimpleTest_Y)
print SimpleTest_Y.Out1

The python invocation of the initialize method works, but when I try to access to SimpleTest_Y.Out1 I get the following error:

print SimpleTest_Y.Out1

AttributeError: '_FuncPtr' object has not attribute 'Out1'

I think I'm not able to access to global var defined on external C library...

NOTICE: it is a structure not a normal var


回答1:


You need to use the in_dll method to access a global variable.

This works:

import ctypes

class Inp(ctypes.Structure):
   _fields_ = [('In1', ctypes.c_float),
               ('In2', ctypes.c_float)]

class Out(ctypes.Structure):
   _fields_ = [('Out1', ctypes.c_float)]

myLib = ctypes.CDLL('./SimpleTest.so')

SimpleTest_initialize = myLib.SimpleTest_initialize
SimpleTest_initialize()

SimpleTest_Y = Out.in_dll(myLib, 'SimpleTest_Y')

print SimpleTest_Y.Out1


来源:https://stackoverflow.com/questions/35346835/how-to-access-to-c-global-variable-structure-by-python-and-ctype

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!