{{{#!wiki caution '''Python 2.x will no longer be supported after 1 Jan 2020.''' Python 2 reaches end of life in January 2020, and will no longer receive security updates. This page has resources to help with porting applications still running Python 2 to Python 3. }}} This is a list of suggestions about the migration of Python C extension modules to Python 3.0. Feel free to expand the list! * First of all, see [[http://docs.python.org/dev/3.0/howto/cporting.html|Porting extension modules to 3.0]] in the official Python 3 documentation. * Use conditional compilation to make your code able to compile under both Python 2.x and 3.0 C-API. * Now Python 3 uses Unicode as internal string representation, all the class name, method name, etc are Unicode strings. So check all the occurrences of PyString_*, most of them should be replaced with PyUnicode_*. When you suffer a segmentation fault, sometimes it's because you provided a PyString where the C-API is expecting a PyUnicode. Also, for the return value of your C extension function, you may use PyUnicode instead of PyString, otherwise you may break your client's code. * PyInt_* removed, but you can explicitly ``#include `` to define aliases that redirect most PyInt_* symbols to PyLong_*. * PEP 3123: Making PyObject_HEAD conform to standard C (http://www.python.org/dev/peps/pep-3123/). When initializing type objects, replace {{{#!cplusplus PyObject_HEAD_INIT(NULL) 0, /* ob_size */ }}} with {{{#!cplusplus PyVarObject_HEAD_INIT(NULL, 0) }}} And you'd better use pre-defined macros Py_TYPE(o), Py_REFCNT(o), Py_SIZE(o) to access o->ob_type, o->ob_refcnt and o->ob_size separately. For more details please read the PEP. * Changes in PyNumberMethods: nb_divide, nb_coerce, nb_oct, nb_hex and nb_inplace_divide removed. * Read PEP 3121 Extension Module Initialization and Finalization (http://www.python.org/dev/peps/pep-3121/) and change your code to the new API. It solved many problems for module initialization and finalization. * Now PyObject_Compare() raises exception when comparing two objects of different type. (In case of Python 2.x, it compares their pointer.) * If your object has slicing interface (eg. obj[2:5]), you should notice that __getitem__, __setitem__ and __delitem__ now receive PySliceObject instead of a pair of integer value. * Unbound method removed. In Python 3 you can use PyInstanceMethod_New() C-API to generate an unbound method for your C function. * PyClass_Check() removed. Consider this as a workaround: {{{#!cplusplus #define PyClass_Check(obj) PyObject_IsInstance(obj, (PyObject *)&PyType_Type) }}} * PyInstance_NewRaw() removed, try to use PyBaseObject_Type.tp_new() for replacement. * In py3k dict.items() method returns a dict_items object, you can use PySequence_Fast() to convert it to a sequence. * struct member flags: The RO shorthand for READONLY is gone.