Setting a C-structure from Python
bdupire
bdupire at seatech.fau.edu
Thu Jul 6 10:53:16 EDT 2000
I already posted this message on www.deja.com but as it doesn't appear
in the newsgroup, I repost it here.
My aim is to write an extension module to access functions in C which
"get" and "set" some structures from/in shared memory.
In order to do this, I implemented the following programs:
* structure.py
* test_API.c
It works well when I set the structure the first time, but not a second
time I have got the following (run-time) error... did I miss something?
>>> import structure
The structure is now:
name Benoit
age 22
rate 3.141500
Traceback (innermost last):
File "<stdin>", line 1, in ?
File "structure.py", line 19, in ?
test_API.setstruct(packed)
TypeError: argument 1: expected string,
found
I am working with Python 1.5.2 on QNX 4.25
test_API.c is therefore statically linked with Python as dynamic
linking is not possible on QNX.
file : structure.py
-----------------------------------------
import struct
import test_API
#1st try
fmt="20sif"
a="Benoit"
b=22
c=3.1415
packed=struct.pack(fmt,a,b,c)
test_API.setstruct(packed)
#2nd try
a="Ben"
b=23
c=3.1417
packed=struct.pack(fmt,a,b,c)
test_API.setstruct(packed)
file: test_API.c
--------------------------------------
#include <stdio.h>
#include "Python.h"
typedef struct{
char name[20];
int age;
float rate;
} examplestruct;
examplestruct * example;
static void print_struct()
{
printf("The structure is now: \n");
printf("name %s\n",example->name);
printf("age %i\n",example->age);
printf("rate %f\n", example->rate);
}
static PyObject * test_setstruct(PyObject * self, PyObject * args) {
PyObject * string_from_python;
if (!PyArg_ParseTuple(args,"S",&string_from_python)) return NULL;
example= (examplestruct *) PyString_AsString(string_from_python);
Py_DECREF(string_from_python);
print_struct();
Py_INCREF(Py_None);
return Py_None;
}
static PyObject * test_getstruct(PyObject * self, PyObject * args) {
/* if there are any arguments */
if (!PyArg_NoArgs(args))
return NULL;
return PyString_FromString(example);
}
/*************************************************************
METHOD REGISTRATION TABLE
List of functions defined in the module
*************************************************************/
static struct PyMethodDef test_API_methods[] = {
{"setstruct", test_setstruct, 1},
{"getstruct", test_getstruct, 1},
{NULL, NULL}
};
/*************************************************************
Initialization function
*************************************************************/
void inittest_API()
{
PyObject *m, *d;
/*create the module and add the functions */
m= Py_InitModule("test_API", test_API_methods);
/* add symbolic constants to the module */
d= PyModule_GetDict(m);
if (PyErr_Occurred())
Py_FatalError("can't initialize module test_API\n"); }
More information about the Python-list
mailing list