Segfault accessing dictionary in C Python module

Mitko Haralanov mitko at qlogic.com
Mon Apr 21 20:00:16 EDT 2008


I have a Python module that I have written using the C API and I am
having a problem accessing a dictionary from that module.

Here is what I have done:
1. In my init function I call
	module = Py_InitModule ("name", methods);
2. then I get the module's __dict__ structure:
	dict = PyModule_GetDict (module);
3. Later, I insert a dictionary that I have constructed using the
PyDict_* API
	new_dict = PyDict_New ();
	<Insert values in dict>
	PyDict_SetItemString (dict, "dict_name", new_dict);

Here is the problem:
In one of my methods, I need to retrieve the new_dict dictionary and
use it to get a value out of it. I get the dictionary using the
PyObject_GetAttrString function:
	new_dict = PyObject_GetAttrString (module, "dict_name");
	(module is a global variable for the file)

I make the key from an int with:
	key = PyInt_FromLong (state); (where state is an int variable)

and then get the value for that key:
	value = PyDict_GetItem (new_dict, key);

The problem is that for the first few times I call the function,
everything work but after that value (which should contain a PyString)
starts getting random values and eventually my program crashes with a
segfault.

When I try to print the address of the dict variable returned by
PyObject_GetAttrString() I always get the same value, so the function
is returning the same thing. However, when I try to print the string
representation of the return value with this:
	obj = PyObject_Str (new_dict);
	if (PyString_Check (obj))
		printf ("%s\n", PyString_AsString (obj));

it works the first few calls and then my program segfaults at the
PyObject_Str (new_dict) call.

As far as I know, I have done everything by the book yet I can't seem
to figure out where the problem is. Any help would be great?

Thank you

-- 
Mitko Haralanov					 mitko at qlogic.com
Senior Software Engineer			     650.934.8064
HSG InfiniBand Engineering		    http://www.qlogic.com

==========================================
There are never any bugs you haven't found yet.



More information about the Python-list mailing list