[C++-sig] Segfault when accessing a boost::python::dict?

Fred Baba fred.baba at gmail.com
Wed Jan 30 04:33:00 CET 2013


Hello,

I'm a bit new to boost::python and I've run into a strange
segmentation fault issue. I'm attempting to convert a dict object to a
boost::property_tree::ptree using the code below. I'm getting the
error when I attempt to access the input dict, with the following
stacktrace:

(gdb) bt
#0  0x00000001004d58df in PyObject_RichCompare ()
#1  0x00000001004d64e0 in PyObject_RichCompareBool ()
#2  0x00000001004cbf9d in lookdict ()
#3  0x00000001004cfa4f in dict_subscript ()
#4  0x00000001000c9cc5 in boost::python::api::getitem ()
#5  0x000000010000218b in boost::python::api::const_item_policies::get
(target=@0x7fff5fbff680, key=@0x7fff5fbff688) at object_items.hpp:68
#6  0x000000010000371b in
boost::python::api::proxy<boost::python::api::const_item_policies>::operator
boost::python::api::object (this=0x7fff5fbff680) at proxy.hpp:64
#7  0x0000000100000f56 in ptree_from_dict (d=@0x7fff5fbff6d0) at
test_ptree.cpp:55
#8  0x00000001000015fd in main () at test_ptree.cpp:104

Any help/advice would be greatly appreciated. The code below was
adapted from an existing github project, and I can't figure out what's
amiss.

Thanks,
Fred Baba

template<typename T>
bool try_set(boost::property_tree::ptree &pt, const std::string &key,
object &val) {
	extract<T> ex(val);
	if (ex.check()) {
		pt.put<T>(key, ex());
		return true;
	}
	return false;
}

boost::property_tree::ptree ptree_from_dict(const dict &d) {
	boost::property_tree::ptree pt;
	boost::python::list keys = d.keys();
	for (int i = 0; i < len(keys); ++i) {
		std::string key = extract<std::string>(keys[i]);
		object val = d[key];

		try_set<std::string>(pt, key, val)
		|| try_set<long>(pt, key, val)
		|| try_set<double>(pt, key, val);
	}
	return pt;
}

int main() {
	try {
		Py_Initialize();

		dict d;
		d["foo"] = 5;
		d["bar"] = "baz";

		object o = ptree_to_object(ptree());

		ptree p = ptree_from_dict(d);
		write_json(std::cout, p);

		Py_Finalize();
	} catch (error_already_set const&) {
		PyErr_Print();
	}
	return 0;
}


More information about the Cplusplus-sig mailing list