From: Angelo Compagnucci <angelo.compagnucci-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
To: linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
jdelvare-l3A5Bk7waGM@public.gmane.org
Subject: i2c-tools: add compatibility for python2/3 to py-smbus
Date: Mon, 19 Jan 2015 16:13:26 +0100 [thread overview]
Message-ID: <CA+TH9VkT1K2aqAuNOLsGiU407OA4NYcMVaUakEQgSWLpMBBg2A@mail.gmail.com> (raw)
[-- 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
}
next reply other threads:[~2015-01-19 15:13 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-01-19 15:13 Angelo Compagnucci [this message]
[not found] ` <CA+TH9VkT1K2aqAuNOLsGiU407OA4NYcMVaUakEQgSWLpMBBg2A-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-01-19 22:03 ` i2c-tools: add compatibility for python2/3 to py-smbus 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
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CA+TH9VkT1K2aqAuNOLsGiU407OA4NYcMVaUakEQgSWLpMBBg2A@mail.gmail.com \
--to=angelo.compagnucci-re5jqeeqqe8avxtiumwx3w@public.gmane.org \
--cc=jdelvare-l3A5Bk7waGM@public.gmane.org \
--cc=linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.