| .. highlightlang:: c | 
 |  | 
 | .. _cporting-howto: | 
 |  | 
 | ************************************* | 
 | Porting Extension Modules to Python 3 | 
 | ************************************* | 
 |  | 
 | :author: Benjamin Peterson | 
 |  | 
 |  | 
 | .. topic:: Abstract | 
 |  | 
 |    Although changing the C-API was not one of Python 3's objectives, | 
 |    the many Python-level changes made leaving Python 2's API intact | 
 |    impossible.  In fact, some changes such as :func:`int` and | 
 |    :func:`long` unification are more obvious on the C level.  This | 
 |    document endeavors to document incompatibilities and how they can | 
 |    be worked around. | 
 |  | 
 |  | 
 | Conditional compilation | 
 | ======================= | 
 |  | 
 | The easiest way to compile only some code for Python 3 is to check | 
 | if :c:macro:`PY_MAJOR_VERSION` is greater than or equal to 3. :: | 
 |  | 
 |    #if PY_MAJOR_VERSION >= 3 | 
 |    #define IS_PY3K | 
 |    #endif | 
 |  | 
 | API functions that are not present can be aliased to their equivalents within | 
 | conditional blocks. | 
 |  | 
 |  | 
 | Changes to Object APIs | 
 | ====================== | 
 |  | 
 | Python 3 merged together some types with similar functions while cleanly | 
 | separating others. | 
 |  | 
 |  | 
 | str/unicode Unification | 
 | ----------------------- | 
 |  | 
 | Python 3's :func:`str` type is equivalent to Python 2's :func:`unicode`; the C | 
 | functions are called ``PyUnicode_*`` for both.  The old 8-bit string type has become | 
 | :func:`bytes`, with C functions called ``PyBytes_*``.  Python 2.6 and later provide a compatibility header, | 
 | :file:`bytesobject.h`, mapping ``PyBytes`` names to ``PyString`` ones.  For best | 
 | compatibility with Python 3, :c:type:`PyUnicode` should be used for textual data and | 
 | :c:type:`PyBytes` for binary data.  It's also important to remember that | 
 | :c:type:`PyBytes` and :c:type:`PyUnicode` in Python 3 are not interchangeable like | 
 | :c:type:`PyString` and :c:type:`PyUnicode` are in Python 2.  The following example | 
 | shows best practices with regards to :c:type:`PyUnicode`, :c:type:`PyString`, | 
 | and :c:type:`PyBytes`. :: | 
 |  | 
 |    #include "stdlib.h" | 
 |    #include "Python.h" | 
 |    #include "bytesobject.h" | 
 |  | 
 |    /* text example */ | 
 |    static PyObject * | 
 |    say_hello(PyObject *self, PyObject *args) { | 
 |        PyObject *name, *result; | 
 |  | 
 |        if (!PyArg_ParseTuple(args, "U:say_hello", &name)) | 
 |            return NULL; | 
 |  | 
 |        result = PyUnicode_FromFormat("Hello, %S!", name); | 
 |        return result; | 
 |    } | 
 |  | 
 |    /* just a forward */ | 
 |    static char * do_encode(PyObject *); | 
 |  | 
 |    /* bytes example */ | 
 |    static PyObject * | 
 |    encode_object(PyObject *self, PyObject *args) { | 
 |        char *encoded; | 
 |        PyObject *result, *myobj; | 
 |  | 
 |        if (!PyArg_ParseTuple(args, "O:encode_object", &myobj)) | 
 |            return NULL; | 
 |  | 
 |        encoded = do_encode(myobj); | 
 |        if (encoded == NULL) | 
 |            return NULL; | 
 |        result = PyBytes_FromString(encoded); | 
 |        free(encoded); | 
 |        return result; | 
 |    } | 
 |  | 
 |  | 
 | long/int Unification | 
 | -------------------- | 
 |  | 
 | Python 3 has only one integer type, :func:`int`.  But it actually | 
 | corresponds to Python 2's :func:`long` type--the :func:`int` type | 
 | used in Python 2 was removed.  In the C-API, ``PyInt_*`` functions | 
 | are replaced by their ``PyLong_*`` equivalents. | 
 |  | 
 |  | 
 | Module initialization and state | 
 | =============================== | 
 |  | 
 | Python 3 has a revamped extension module initialization system.  (See | 
 | :pep:`3121`.)  Instead of storing module state in globals, they should | 
 | be stored in an interpreter specific structure.  Creating modules that | 
 | act correctly in both Python 2 and Python 3 is tricky.  The following | 
 | simple example demonstrates how. :: | 
 |  | 
 |    #include "Python.h" | 
 |  | 
 |    struct module_state { | 
 |        PyObject *error; | 
 |    }; | 
 |  | 
 |    #if PY_MAJOR_VERSION >= 3 | 
 |    #define GETSTATE(m) ((struct module_state*)PyModule_GetState(m)) | 
 |    #else | 
 |    #define GETSTATE(m) (&_state) | 
 |    static struct module_state _state; | 
 |    #endif | 
 |  | 
 |    static PyObject * | 
 |    error_out(PyObject *m) { | 
 |        struct module_state *st = GETSTATE(m); | 
 |        PyErr_SetString(st->error, "something bad happened"); | 
 |        return NULL; | 
 |    } | 
 |  | 
 |    static PyMethodDef myextension_methods[] = { | 
 |        {"error_out", (PyCFunction)error_out, METH_NOARGS, NULL}, | 
 |        {NULL, NULL} | 
 |    }; | 
 |  | 
 |    #if PY_MAJOR_VERSION >= 3 | 
 |  | 
 |    static int myextension_traverse(PyObject *m, visitproc visit, void *arg) { | 
 |        Py_VISIT(GETSTATE(m)->error); | 
 |        return 0; | 
 |    } | 
 |  | 
 |    static int myextension_clear(PyObject *m) { | 
 |        Py_CLEAR(GETSTATE(m)->error); | 
 |        return 0; | 
 |    } | 
 |  | 
 |  | 
 |    static struct PyModuleDef moduledef = { | 
 |            PyModuleDef_HEAD_INIT, | 
 |            "myextension", | 
 |            NULL, | 
 |            sizeof(struct module_state), | 
 |            myextension_methods, | 
 |            NULL, | 
 |            myextension_traverse, | 
 |            myextension_clear, | 
 |            NULL | 
 |    }; | 
 |  | 
 |    #define INITERROR return NULL | 
 |  | 
 |    PyObject * | 
 |    PyInit_myextension(void) | 
 |  | 
 |    #else | 
 |    #define INITERROR return | 
 |  | 
 |    void | 
 |    initmyextension(void) | 
 |    #endif | 
 |    { | 
 |    #if PY_MAJOR_VERSION >= 3 | 
 |        PyObject *module = PyModule_Create(&moduledef); | 
 |    #else | 
 |        PyObject *module = Py_InitModule("myextension", myextension_methods); | 
 |    #endif | 
 |  | 
 |        if (module == NULL) | 
 |            INITERROR; | 
 |        struct module_state *st = GETSTATE(module); | 
 |  | 
 |        st->error = PyErr_NewException("myextension.Error", NULL, NULL); | 
 |        if (st->error == NULL) { | 
 |            Py_DECREF(module); | 
 |            INITERROR; | 
 |        } | 
 |  | 
 |    #if PY_MAJOR_VERSION >= 3 | 
 |        return module; | 
 |    #endif | 
 |    } | 
 |  | 
 |  | 
 | CObject replaced with Capsule | 
 | ============================= | 
 |  | 
 | The :c:type:`Capsule` object was introduced in Python 3.1 and 2.7 to replace | 
 | :c:type:`CObject`.  CObjects were useful, | 
 | but the :c:type:`CObject` API was problematic: it didn't permit distinguishing | 
 | between valid CObjects, which allowed mismatched CObjects to crash the | 
 | interpreter, and some of its APIs relied on undefined behavior in C. | 
 | (For further reading on the rationale behind Capsules, please see :issue:`5630`.) | 
 |  | 
 | If you're currently using CObjects, and you want to migrate to 3.1 or newer, | 
 | you'll need to switch to Capsules. | 
 | :c:type:`CObject` was deprecated in 3.1 and 2.7 and completely removed in | 
 | Python 3.2.  If you only support 2.7, or 3.1 and above, you | 
 | can simply switch to :c:type:`Capsule`.  If you need to support Python 3.0, | 
 | or versions of Python earlier than 2.7, | 
 | you'll have to support both CObjects and Capsules. | 
 | (Note that Python 3.0 is no longer supported, and it is not recommended | 
 | for production use.) | 
 |  | 
 | The following example header file :file:`capsulethunk.h` may | 
 | solve the problem for you.  Simply write your code against the | 
 | :c:type:`Capsule` API and include this header file after | 
 | :file:`Python.h`.  Your code will automatically use Capsules | 
 | in versions of Python with Capsules, and switch to CObjects | 
 | when Capsules are unavailable. | 
 |  | 
 | :file:`capsulethunk.h` simulates Capsules using CObjects.  However, | 
 | :c:type:`CObject` provides no place to store the capsule's "name".  As a | 
 | result the simulated :c:type:`Capsule` objects created by :file:`capsulethunk.h` | 
 | behave slightly differently from real Capsules.  Specifically: | 
 |  | 
 |   * The name parameter passed in to :c:func:`PyCapsule_New` is ignored. | 
 |  | 
 |   * The name parameter passed in to :c:func:`PyCapsule_IsValid` and | 
 |     :c:func:`PyCapsule_GetPointer` is ignored, and no error checking | 
 |     of the name is performed. | 
 |  | 
 |   * :c:func:`PyCapsule_GetName` always returns NULL. | 
 |  | 
 |   * :c:func:`PyCapsule_SetName` always raises an exception and | 
 |     returns failure.  (Since there's no way to store a name | 
 |     in a CObject, noisy failure of :c:func:`PyCapsule_SetName` | 
 |     was deemed preferable to silent failure here.  If this is | 
 |     inconvenient, feel free to modify your local | 
 |     copy as you see fit.) | 
 |  | 
 | You can find :file:`capsulethunk.h` in the Python source distribution | 
 | as :source:`Doc/includes/capsulethunk.h`.  We also include it here for | 
 | your convenience: | 
 |  | 
 | .. literalinclude:: ../includes/capsulethunk.h | 
 |  | 
 |  | 
 |  | 
 | Other options | 
 | ============= | 
 |  | 
 | If you are writing a new extension module, you might consider `Cython | 
 | <http://cython.org/>`_.  It translates a Python-like language to C.  The | 
 | extension modules it creates are compatible with Python 3 and Python 2. | 
 |  |