Fix python bindings with versions older than 2.7

Need fixing on the Capsule usage, the lack of PyBytes,
lack of io module and the way to access exception details.
diff --git a/python/libxml.py b/python/libxml.py
index 117de82..e507e0f 100644
--- a/python/libxml.py
+++ b/python/libxml.py
@@ -77,7 +77,9 @@
                 ret = self.__io.read()
             else:
                 ret = self.__io.read(len)
-        except Exception as e:
+        except Exception:
+            import sys
+            e = sys.exc_info()[1]
             print("failed to read from Python:", type(e))
             print("on IO:", self.__io)
             self.__io == None
diff --git a/python/libxml_wrap.h b/python/libxml_wrap.h
index 70248d7..a9b9739 100644
--- a/python/libxml_wrap.h
+++ b/python/libxml_wrap.h
@@ -23,6 +23,25 @@
 #include <libxml/xmlschemas.h>
 #endif
 
+/*
+ * for older versions of Python, we don't use PyBytes, but keep PyString
+ * and don't use Capsule but CObjects
+ */
+#if PY_VERSION_HEX < 0x02070000
+#ifndef PyBytes_Check
+#define PyBytes_Check PyString_Check
+#define PyBytes_Size PyString_Size
+#define PyBytes_AsString PyString_AsString
+#define PyBytes_AS_STRING PyString_AS_STRING
+#define PyBytes_GET_SIZE PyString_GET_SIZE
+
+#define PyCapsule_New PyCObject_FromVoidPtrAndDesc
+#define PyCapsule_CheckExact PyCObject_Check
+#define PyCapsule_GetPointer(o, n) PyCObject_GetDesc((o))
+
+#endif
+#endif
+
 /**
  * ATTRIBUTE_UNUSED:
  *
diff --git a/python/tests/input_callback.py b/python/tests/input_callback.py
index f8d08d5..495ab62 100755
--- a/python/tests/input_callback.py
+++ b/python/tests/input_callback.py
@@ -133,7 +133,7 @@
 try:
     while True:
         libxml2.popInputCallbacks()
-except IndexError as e:
+except IndexError:
     pass
 
 run_test(desc="Loading using standard i/o after unregistering all callbacks",
diff --git a/python/tests/reader7.py b/python/tests/reader7.py
index a24ee11..c88e370 100755
--- a/python/tests/reader7.py
+++ b/python/tests/reader7.py
@@ -3,7 +3,6 @@
 # this tests the entities substitutions with the XmlTextReader interface
 #
 import sys
-import io
 import libxml2
 
 # Memory debug specific
diff --git a/python/tests/reader8.py b/python/tests/reader8.py
index d7064eb..de2dcd6 100755
--- a/python/tests/reader8.py
+++ b/python/tests/reader8.py
@@ -3,7 +3,6 @@
 # this tests the entities substitutions with the XmlTextReader interface
 #
 import sys
-import io
 import libxml2
 
 # Memory debug specific
diff --git a/python/tests/walker.py b/python/tests/walker.py
index 5c6f06d..47f0557 100755
--- a/python/tests/walker.py
+++ b/python/tests/walker.py
@@ -3,7 +3,6 @@
 # this tests the entities substitutions with the XmlTextReader interface
 #
 import sys
-import io
 import libxml2
 
 # Memory debug specific
diff --git a/python/tests/xpathleak.py b/python/tests/xpathleak.py
index d2196fa..33ab61c 100755
--- a/python/tests/xpathleak.py
+++ b/python/tests/xpathleak.py
@@ -42,7 +42,7 @@
 for expr in badexprs:
 	try:
 		ctxt.xpathEval(expr)
-	except libxml2.xpathError as e:
+	except libxml2.xpathError:
 	        pass
 	else:
 		print("Unexpectedly legal expression:", expr)
diff --git a/python/types.c b/python/types.c
index c865b65..31c909a 100644
--- a/python/types.c
+++ b/python/types.c
@@ -384,19 +384,29 @@
 
 /**
  * libxml_xmlXPathDestructNsNode:
- * cobj: xmlNsPtr namespace node capsule object
+ * cap: xmlNsPtr namespace node capsule object
  *
  * This function is called if and when a namespace node returned in
  * an XPath node set is to be destroyed. That's the only kind of
  * object returned in node set not directly linked to the original
  * xmlDoc document, see xmlXPathNodeSetDupNs.
  */
+#if PY_VERSION_HEX < 0x02070000
 static void
-libxml_xmlXPathDestructNsNode(PyObject *cap) {
-#ifdef DEBUG
-    fprintf(stderr, "libxml_xmlXPathDestructNsNode called %p\n", cobj);
+libxml_xmlXPathDestructNsNode(void *cap, void *desc ATTRIBUTE_UNUSED)
+#else
+static void
+libxml_xmlXPathDestructNsNode(PyObject *cap)
 #endif
+{
+#ifdef DEBUG
+    fprintf(stderr, "libxml_xmlXPathDestructNsNode called %p\n", cap);
+#endif
+#if PY_VERSION_HEX < 0x02070000
+    xmlXPathNodeSetFreeNs((xmlNsPtr) cap);
+#else
     xmlXPathNodeSetFreeNs((xmlNsPtr) PyCapsule_GetPointer(cap, "xmlNsPtr"));
+#endif
 }
 
 PyObject *
@@ -658,7 +668,7 @@
             cur = NULL;
             if (PyCapsule_CheckExact(node)) {
 #ifdef DEBUG
-                printf("Got a CObject\n");
+                printf("Got a Capsule\n");
 #endif
                 cur = PyxmlNode_Get(node);
             } else if ((PyObject_HasAttrString(node, (char *) "_o")) &&