All of lore.kernel.org
 help / color / mirror / Atom feed
* i2c-tools: add compatibility for python2/3 to py-smbus
@ 2015-01-19 15:13 Angelo Compagnucci
       [not found] ` <CA+TH9VkT1K2aqAuNOLsGiU407OA4NYcMVaUakEQgSWLpMBBg2A-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
  0 siblings, 1 reply; 9+ messages in thread
From: Angelo Compagnucci @ 2015-01-19 15:13 UTC (permalink / raw)
  To: linux-i2c-u79uwXL29TY76Z2rM5mHXA, jdelvare-l3A5Bk7waGM

[-- Attachment #1: Type: text/plain, Size: 487 bytes --]

Dear Jean Delvare,

Attached you can find a patch that implements py-smbus for python3
with python2 backward compatibility.
This patch is not heavily tested, but it wors well for me.

Unfortunately, I don't know how to use svn for sharing source code, it
is so ugly compared to git and it doesn't provide a way to send
patches via email, so the best way I found was to attach the patch
file.

Hope this helps!

Sincerely, Angelo

-- 
Profile: http://it.linkedin.com/in/compagnucciangelo

[-- Attachment #2: i2c-tools-py-smbus-python2-3-support.patch --]
[-- Type: text/x-patch, Size: 3785 bytes --]

Index: smbusmodule.c
===================================================================
diff --git a/i2c-tools/trunk/py-smbus/smbusmodule.c b/i2c-tools/trunk/py-smbus/smbusmodule.c
--- a/i2c-tools/trunk/py-smbus/smbusmodule.c	(revision 6261)
+++ b/i2c-tools/trunk/py-smbus/smbusmodule.c	(working copy)
@@ -18,14 +18,16 @@
 
 #include <Python.h>
 #include "structmember.h"
-#include <sys/ioctl.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <fcntl.h>
-#include <linux/i2c.h>
 #include <linux/i2c-dev.h>
-#include <i2c/smbus.h>
 
+/* Required for backward compatibility with python 2*/
+#if PY_MAJOR_VERSION >= 3
+#define PY3
+#endif
+
 /*
 ** These are required to build this module against Linux older than 2.6.23.
 */
@@ -35,6 +37,7 @@
 #define I2C_SMBUS_I2C_BLOCK_DATA	8
 #endif
 
+#ifndef PY3
 PyDoc_STRVAR(SMBus_module_doc,
 	"This module defines an object type that allows SMBus transactions\n"
 	"on hosts running the Linux kernel.  The host kernel must have I2C\n"
@@ -44,6 +47,7 @@
 	"\n"
 	"Because the I2C device interface is opened R/W, users of this\n"
 	"module usually must have root permissions.\n");
+#endif
 
 typedef struct {
 	PyObject_HEAD
@@ -94,7 +98,11 @@
 	PyObject *ref = SMBus_close(self);
 	Py_XDECREF(ref);
 
+#ifndef PY3
 	self->ob_type->tp_free((PyObject *)self);
+#else
+	Py_TYPE(self)->tp_free((PyObject *)self);
+#endif
 }
 
 #define MAXPATH 16
@@ -434,11 +442,19 @@
 
 	for (ii = 0; ii < len; ii++) {
 		PyObject *val = PyList_GET_ITEM(list, ii);
+#ifndef PY3
 		if (!PyInt_Check(val)) {
 			PyErr_SetString(PyExc_TypeError, msg);
 			return 0; /* fail */
 		}
 		data->block[ii+1] = (__u8)PyInt_AS_LONG(val);
+#else
+		if (!PyLong_Check(val)) {
+			PyErr_SetString(PyExc_TypeError, msg);
+			return 0; /* fail */
+		}
+		data->block[ii+1] = (__u8)PyLong_AS_LONG(val);
+#endif
 	}
 
 	return 1; /* success */
@@ -636,12 +652,18 @@
 	{NULL},
 };
 
+#ifndef PY3
 static PyTypeObject SMBus_type = {
 	PyObject_HEAD_INIT(NULL)
 	0,				/* ob_size */
 	"smbus.SMBus",			/* tp_name */
-	sizeof(SMBus),			/* tp_basicsize */
-	0,				/* tp_itemsize */
+#else
+static PyTypeObject SMBus_type = {
+	PyVarObject_HEAD_INIT(NULL, 0)
+	"SMBus",			/* tp_name */
+#endif
+	sizeof(SMBus),		/* tp_basicsize */
+	0,				    /* tp_itemsize */
 	(destructor)SMBus_dealloc,	/* tp_dealloc */
 	0,				/* tp_print */
 	0,				/* tp_getattr */
@@ -678,24 +700,64 @@
 	SMBus_new,			/* tp_new */
 };
 
+#ifndef PY3
 static PyMethodDef SMBus_module_methods[] = {
 	{NULL}
 };
+#else
+static struct PyModuleDef SMBusModule = {
+	PyModuleDef_HEAD_INIT,
+	"SMBus",	/* m_name */
+	"This module defines an object type that allows SMBus transactions\n"
+	"on hosts running the Linux kernel.  The host kernel must have I2C\n"
+	"support, I2C device interface support, and a bus adapter driver.\n"
+	"All of these can be either built-in to the kernel, or loaded from\n"
+	"modules.\n"
+	"\n"
+	"Because the I2C device interface is opened R/W, users of this\n"
+	"module usually must have root permissions.\n",  /* m_doc */
+	-1, /* m_size */
+	NULL, /* m_methods */
+	NULL, /* m_reload */
+	NULL, /* m_traverse */
+	NULL, /* m_clear */
+	NULL, /* m_free */
+};
+#endif
 
 #ifndef PyMODINIT_FUNC	/* declarations for DLL import/export */
 #define PyMODINIT_FUNC void
 #endif
 PyMODINIT_FUNC
-initsmbus(void) 
+
+#ifndef PY3
+initsmbus(void)
+#else
+PyInit_smbus(void)
+#endif 
 {
 	PyObject* m;
 
 	if (PyType_Ready(&SMBus_type) < 0)
+#ifndef PY3
 		return;
+#else
+		return NULL;
+#endif
 
+#ifndef PY3
 	m = Py_InitModule3("smbus", SMBus_module_methods, SMBus_module_doc);
+#else
+	m = PyModule_Create(&SMBusModule);
+	if (m == NULL)
+		return NULL;
+#endif
 
 	Py_INCREF(&SMBus_type);
 	PyModule_AddObject(m, "SMBus", (PyObject *)&SMBus_type);
+
+#ifdef PY3
+	return m;
+#endif
 }
 

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2015-04-09 20:32 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-01-19 15:13 i2c-tools: add compatibility for python2/3 to py-smbus Angelo Compagnucci
     [not found] ` <CA+TH9VkT1K2aqAuNOLsGiU407OA4NYcMVaUakEQgSWLpMBBg2A-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-01-19 22:03   ` Jean Delvare
     [not found]     ` <20150119230327.0224d0ba-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
2015-01-22  8:56       ` Michael Mercier
     [not found]         ` <1421917018.21840.0-YAXBhf1W29QAs8EywTwl9A@public.gmane.org>
2015-01-22 10:25           ` Jean Delvare
2015-01-22 10:49           ` Jean Delvare
     [not found]             ` <20150122114958.3178f5f6-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
2015-01-22 13:28               ` Michael Mercier
     [not found]                 ` <1421933290.21840.1-YAXBhf1W29QAs8EywTwl9A@public.gmane.org>
2015-01-22 13:37                   ` Jean Delvare
2015-01-26 11:46                   ` Jean Delvare
     [not found]                     ` <20150126124615.7fd1f64f-R0o5gVi9kd7kN2dkZ6Wm7A@public.gmane.org>
2015-04-09 20:32                       ` Angelo Compagnucci

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.