在Python中访问结构体的c指针
能不能把一个 int
转换成一个类的类型呢?
我在C语言中有以下代码:
#include "Python.h"
#define PYTHON_FILENAME "modelparam"
void getmodelparam(long pModelParam) ;
typedef struct {
int seconds;
int nanoseconds;
} someTime;
int main ()
{
someTime *pSome ;
long a ;
printf ("Testing the python interfaces\n") ;
pSome = (someTime *) calloc(1, sizeof(someTime)) ;
pSome->seconds = 10 ;
pSome->nanoseconds = 20 ;
a = (long) pSome ;
printf ("a is %d, pSome is %d\n", a, pSome) ;
getmodelparam(a) ;
printf ("After the python call values are : %d, %d\n",pSome->seconds, pSome->nanoseconds) ;
return 0 ;
}
void getmodelparam(long pModelParam)
{
PyObject *pName ;
PyObject *pModule ;
PyObject *pDict ;
PyObject *pFunc ;
int iSize = 0 ;
char pcFunctionName[] = "modifymodelparam" ;
double dTemp1, dTemp2 ;
/* Initialize the python interpreter */
Py_Initialize() ;
/* Get Python code/module */
pName = PyUnicode_FromString(PYTHON_FILENAME);
if (NULL != pName)
{
/* Import the module equivalent to doing 'import calresidual' in python */
pModule = PyImport_Import(pName);
Py_DECREF(pName) ;
if (NULL != pModule)
{
/* Get the function and check if its callable function */
pFunc = PyObject_GetAttrString(pModule, pcFunctionName);
if (pFunc && PyCallable_Check(pFunc))
{
/* Build the input arguments */
PyObject *pResult = PyObject_CallFunction(pFunc,"i", pModelParam) ;
}
else
{
printf ("Some error with the function\n") ;
}
}
else
{
printf ("Couldnt load the module %s\n", PYTHON_FILENAME) ;
}
}
else
{
printf ("Couldnt convert the name of the module to python name\n") ;
}
/* Release the resources. */
Py_DECREF(pModule) ;
Py_DECREF(pFunc) ;
Py_DECREF(pName) ;
/*Release the interpreter */
Py_Finalize() ;
}
还有在Python中的代码:
import ctypes
class someTime(ctypes.Structure):
_fields_ = [("seconds", ctypes.c_uint),
("nanoseconds", ctypes.c_uint)]
def modifymodelparam(m):
# Not sure how to access internal elements using m ??
# How to typecast m ??
n = someTime(m)
print ('Seconds', n.seconds)
我该怎么把从C传过来的地址转换成Python中的类类型,这样我就可以访问那些类的参数,或者说是访问结构体的参数呢?
2 个回答
0
要进行类型转换,可以使用 cast 函数。
比如,n = ctypes.cast(m, someTime)
1
上面的代码有一些错误。
需要把指针的地址以无符号长整型或整型的形式传递给Python模块。所以
void getmodelparam(long pModelParam)
//has to become
void getmodelparam(unsigned long pModelParam)
//and
PyObject *pResult = PyObject_CallFunction(pFunc,"i", pModelParam) ;
// has to become
PyObject *pResult = PyObject_CallFunction(pFunc,"k", pModelParam) ;
然后在Python文件中:
def modifymodelparam(m):
n = ctypes.cast(m, ctypes.POINTER(someTime))
print (n.contents.seconds)
print (n.contents.nanoseconds)