5
*************************************
6
Porting Extension Modules to Python 3
7
*************************************
9
:author: Benjamin Peterson
14
Although changing the C-API was not one of Python 3's objectives,
15
the many Python-level changes made leaving Python 2's API intact
16
impossible. In fact, some changes such as :func:`int` and
17
:func:`long` unification are more obvious on the C level. This
18
document endeavors to document incompatibilities and how they can
22
Conditional compilation
23
=======================
25
The easiest way to compile only some code for Python 3 is to check
26
if :c:macro:`PY_MAJOR_VERSION` is greater than or equal to 3. ::
28
#if PY_MAJOR_VERSION >= 3
32
API functions that are not present can be aliased to their equivalents within
36
Changes to Object APIs
37
======================
39
Python 3 merged together some types with similar functions while cleanly
43
str/unicode Unification
44
-----------------------
47
Python 3's :func:`str` (``PyString_*`` functions in C) type is equivalent to
48
Python 2's :func:`unicode` (``PyUnicode_*``). The old 8-bit string type has
49
become :func:`bytes`. Python 2.6 and later provide a compatibility header,
50
:file:`bytesobject.h`, mapping ``PyBytes`` names to ``PyString`` ones. For best
51
compatibility with Python 3, :c:type:`PyUnicode` should be used for textual data and
52
:c:type:`PyBytes` for binary data. It's also important to remember that
53
:c:type:`PyBytes` and :c:type:`PyUnicode` in Python 3 are not interchangeable like
54
:c:type:`PyString` and :c:type:`PyUnicode` are in Python 2. The following example
55
shows best practices with regards to :c:type:`PyUnicode`, :c:type:`PyString`,
56
and :c:type:`PyBytes`. ::
60
#include "bytesobject.h"
64
say_hello(PyObject *self, PyObject *args) {
65
PyObject *name, *result;
67
if (!PyArg_ParseTuple(args, "U:say_hello", &name))
70
result = PyUnicode_FromFormat("Hello, %S!", name);
75
static char * do_encode(PyObject *);
79
encode_object(PyObject *self, PyObject *args) {
81
PyObject *result, *myobj;
83
if (!PyArg_ParseTuple(args, "O:encode_object", &myobj))
86
encoded = do_encode(myobj);
89
result = PyBytes_FromString(encoded);
98
Python 3 has only one integer type, :func:`int`. But it actually
99
corresponds to Python 2's :func:`long` type--the :func:`int` type
100
used in Python 2 was removed. In the C-API, ``PyInt_*`` functions
101
are replaced by their ``PyLong_*`` equivalents.
104
Module initialization and state
105
===============================
107
Python 3 has a revamped extension module initialization system. (See
108
:pep:`3121`.) Instead of storing module state in globals, they should
109
be stored in an interpreter specific structure. Creating modules that
110
act correctly in both Python 2 and Python 3 is tricky. The following
111
simple example demonstrates how. ::
115
struct module_state {
119
#if PY_MAJOR_VERSION >= 3
120
#define GETSTATE(m) ((struct module_state*)PyModule_GetState(m))
122
#define GETSTATE(m) (&_state)
123
static struct module_state _state;
127
error_out(PyObject *m) {
128
struct module_state *st = GETSTATE(m);
129
PyErr_SetString(st->error, "something bad happened");
133
static PyMethodDef myextension_methods[] = {
134
{"error_out", (PyCFunction)error_out, METH_NOARGS, NULL},
138
#if PY_MAJOR_VERSION >= 3
140
static int myextension_traverse(PyObject *m, visitproc visit, void *arg) {
141
Py_VISIT(GETSTATE(m)->error);
145
static int myextension_clear(PyObject *m) {
146
Py_CLEAR(GETSTATE(m)->error);
151
static struct PyModuleDef moduledef = {
152
PyModuleDef_HEAD_INIT,
155
sizeof(struct module_state),
158
myextension_traverse,
163
#define INITERROR return NULL
166
PyInit_myextension(void)
169
#define INITERROR return
172
initmyextension(void)
175
#if PY_MAJOR_VERSION >= 3
176
PyObject *module = PyModule_Create(&moduledef);
178
PyObject *module = Py_InitModule("myextension", myextension_methods);
183
struct module_state *st = GETSTATE(module);
185
st->error = PyErr_NewException("myextension.Error", NULL, NULL);
186
if (st->error == NULL) {
191
#if PY_MAJOR_VERSION >= 3
197
CObject replaced with Capsule
198
=============================
200
The :c:type:`Capsule` object was introduced in Python 3.1 and 2.7 to replace
201
:c:type:`CObject`. CObjects were useful,
202
but the :c:type:`CObject` API was problematic: it didn't permit distinguishing
203
between valid CObjects, which allowed mismatched CObjects to crash the
204
interpreter, and some of its APIs relied on undefined behavior in C.
205
(For further reading on the rationale behind Capsules, please see :issue:`5630`.)
207
If you're currently using CObjects, and you want to migrate to 3.1 or newer,
208
you'll need to switch to Capsules.
209
:c:type:`CObject` was deprecated in 3.1 and 2.7 and completely removed in
210
Python 3.2. If you only support 2.7, or 3.1 and above, you
211
can simply switch to :c:type:`Capsule`. If you need to support Python 3.0,
212
or versions of Python earlier than 2.7,
213
you'll have to support both CObjects and Capsules.
214
(Note that Python 3.0 is no longer supported, and it is not recommended
217
The following example header file :file:`capsulethunk.h` may
218
solve the problem for you. Simply write your code against the
219
:c:type:`Capsule` API and include this header file after
220
:file:`Python.h`. Your code will automatically use Capsules
221
in versions of Python with Capsules, and switch to CObjects
222
when Capsules are unavailable.
224
:file:`capsulethunk.h` simulates Capsules using CObjects. However,
225
:c:type:`CObject` provides no place to store the capsule's "name". As a
226
result the simulated :c:type:`Capsule` objects created by :file:`capsulethunk.h`
227
behave slightly differently from real Capsules. Specifically:
229
* The name parameter passed in to :c:func:`PyCapsule_New` is ignored.
231
* The name parameter passed in to :c:func:`PyCapsule_IsValid` and
232
:c:func:`PyCapsule_GetPointer` is ignored, and no error checking
233
of the name is performed.
235
* :c:func:`PyCapsule_GetName` always returns NULL.
237
* :c:func:`PyCapsule_SetName` always raises an exception and
238
returns failure. (Since there's no way to store a name
239
in a CObject, noisy failure of :c:func:`PyCapsule_SetName`
240
was deemed preferable to silent failure here. If this is
241
inconvenient, feel free to modify your local
242
copy as you see fit.)
244
You can find :file:`capsulethunk.h` in the Python source distribution
245
as :source:`Doc/includes/capsulethunk.h`. We also include it here for
248
.. literalinclude:: ../includes/capsulethunk.h
255
If you are writing a new extension module, you might consider `Cython
256
<http://www.cython.org>`_. It translates a Python-like language to C. The
257
extension modules it creates are compatible with Python 3 and Python 2.