bpo-24937: Replace the extension module porting HOWTO by links to ext… · python/cpython@2d3ff2b (original) (raw)

`@@ -6,252 +6,21 @@

`

6

6

`Porting Extension Modules to Python 3

`

7

7

`*************************************

`

8

8

``

9

``

`-

:author: Benjamin Peterson

`

10

``

-

11

``

-

12

``

`-

.. topic:: Abstract

`

13

``

-

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

`

19

``

`-

be worked around.

`

20

``

-

21

``

-

22

``

`-

Conditional compilation

`

23

``

`-

=======================

`

24

``

-

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. ::

``

27

``

-

28

``

`-

#if PY_MAJOR_VERSION >= 3

`

29

``

`-

#define IS_PY3K

`

30

``

`-

#endif

`

31

``

-

32

``

`-

API functions that are not present can be aliased to their equivalents within

`

33

``

`-

conditional blocks.

`

34

``

-

35

``

-

36

``

`-

Changes to Object APIs

`

37

``

`-

======================

`

38

``

-

39

``

`-

Python 3 merged together some types with similar functions while cleanly

`

40

``

`-

separating others.

`

41

``

-

42

``

-

43

``

`-

str/unicode Unification

`

44

``

`-


`

45

``

-

46

``

`` -

Python 3's :func:str type is equivalent to Python 2's :func:unicode; the C

``

47

``


functions are called ``PyUnicode_*`` for both. The old 8-bit string type has become

48

``


:func:`bytes`, with C functions called ``PyBytes_*``. Python 2.6 and later provide a compatibility header,

49

``


:file:`bytesobject.h`, mapping ``PyBytes`` names to ``PyString`` ones. For best

50

``

`` -

compatibility with Python 3, :c:type:PyUnicode should be used for textual data and

``

51

``

`` -

:c:type:PyBytes for binary data. It's also important to remember that

``

52

``

`` -

:c:type:PyBytes and :c:type:PyUnicode in Python 3 are not interchangeable like

``

53

``

`` -

:c:type:PyString and :c:type:PyUnicode are in Python 2. The following example

``

54

``

`` -

shows best practices with regards to :c:type:PyUnicode, :c:type:PyString,

``

55

``

`` -

and :c:type:PyBytes. ::

``

56

``

-

57

``

`-

#include "stdlib.h"

`

58

``

`-

#include "Python.h"

`

59

``

`-

#include "bytesobject.h"

`

60

``

-

61

``

`-

/* text example */

`

62

``

`-

static PyObject *

`

63

``

`-

say_hello(PyObject *self, PyObject *args) {

`

64

``

`-

PyObject *name, *result;

`

65

``

-

66

``

`-

if (!PyArg_ParseTuple(args, "U:say_hello", &name))

`

67

``

`-

return NULL;

`

68

``

-

69

``

`-

result = PyUnicode_FromFormat("Hello, %S!", name);

`

70

``

`-

return result;

`

71

``

`-

}

`

72

``

-

73

``

`-

/* just a forward */

`

74

``

`-

static char * do_encode(PyObject *);

`

75

``

-

76

``

`-

/* bytes example */

`

77

``

`-

static PyObject *

`

78

``

`-

encode_object(PyObject *self, PyObject *args) {

`

79

``

`-

char *encoded;

`

80

``

`-

PyObject *result, *myobj;

`

81

``

-

82

``

`-

if (!PyArg_ParseTuple(args, "O:encode_object", &myobj))

`

83

``

`-

return NULL;

`

84

``

-

85

``

`-

encoded = do_encode(myobj);

`

86

``

`-

if (encoded == NULL)

`

87

``

`-

return NULL;

`

88

``

`-

result = PyBytes_FromString(encoded);

`

89

``

`-

free(encoded);

`

90

``

`-

return result;

`

91

``

`-

}

`

92

``

-

93

``

-

94

``

`-

long/int Unification

`

95

``

`-


`

96

``

-

97

``

`` -

Python 3 has only one integer type, :func:int. But it actually

``

98

``

`` -

corresponds to Python 2's :func:long type—the :func:int type

``

99

``


used in Python 2 was removed. In the C-API, ``PyInt_*`` functions

100

``


are replaced by their ``PyLong_*`` equivalents.

101

``

-

102

``

-

103

``

`-

Module initialization and state

`

104

``

`-

===============================

`

105

``

-

106

``

`-

Python 3 has a revamped extension module initialization system. (See

`

107

``

`` -

:pep:3121.) Instead of storing module state in globals, they should

``

108

``

`-

be stored in an interpreter specific structure. Creating modules that

`

109

``

`-

act correctly in both Python 2 and Python 3 is tricky. The following

`

110

``

`-

simple example demonstrates how. ::

`

111

``

-

112

``

`-

#include "Python.h"

`

113

``

-

114

``

`-

struct module_state {

`

115

``

`-

PyObject *error;

`

116

``

`-

};

`

117

``

-

118

``

`-

#if PY_MAJOR_VERSION >= 3

`

119

``

`-

#define GETSTATE(m) ((struct module_state*)PyModule_GetState(m))

`

120

``

`-

#else

`

121

``

`-

#define GETSTATE(m) (&_state)

`

122

``

`-

static struct module_state _state;

`

123

``

`-

#endif

`

124

``

-

125

``

`-

static PyObject *

`

126

``

`-

error_out(PyObject *m) {

`

127

``

`-

struct module_state *st = GETSTATE(m);

`

128

``

`-

PyErr_SetString(st->error, "something bad happened");

`

129

``

`-

return NULL;

`

130

``

`-

}

`

131

``

-

132

``

`-

static PyMethodDef myextension_methods[] = {

`

133

``

`-

{"error_out", (PyCFunction)error_out, METH_NOARGS, NULL},

`

134

``

`-

{NULL, NULL}

`

135

``

`-

};

`

136

``

-

137

``

`-

#if PY_MAJOR_VERSION >= 3

`

138

``

-

139

``

`-

static int myextension_traverse(PyObject *m, visitproc visit, void *arg) {

`

140

``

`-

Py_VISIT(GETSTATE(m)->error);

`

141

``

`-

return 0;

`

142

``

`-

}

`

143

``

-

144

``

`-

static int myextension_clear(PyObject *m) {

`

145

``

`-

Py_CLEAR(GETSTATE(m)->error);

`

146

``

`-

return 0;

`

147

``

`-

}

`

148

``

-

149

``

-

150

``

`-

static struct PyModuleDef moduledef = {

`

151

``

`-

PyModuleDef_HEAD_INIT,

`

152

``

`-

"myextension",

`

153

``

`-

NULL,

`

154

``

`-

sizeof(struct module_state),

`

155

``

`-

myextension_methods,

`

156

``

`-

NULL,

`

157

``

`-

myextension_traverse,

`

158

``

`-

myextension_clear,

`

159

``

`-

NULL

`

160

``

`-

};

`

161

``

-

162

``

`-

#define INITERROR return NULL

`

163

``

-

164

``

`-

PyMODINIT_FUNC

`

165

``

`-

PyInit_myextension(void)

`

166

``

-

167

``

`-

#else

`

168

``

`-

#define INITERROR return

`

169

``

-

170

``

`-

void

`

171

``

`-

initmyextension(void)

`

172

``

`-

#endif

`

173

``

`-

{

`

174

``

`-

#if PY_MAJOR_VERSION >= 3

`

175

``

`-

PyObject *module = PyModule_Create(&moduledef);

`

176

``

`-

#else

`

177

``

`-

PyObject *module = Py_InitModule("myextension", myextension_methods);

`

178

``

`-

#endif

`

179

``

-

180

``

`-

if (module == NULL)

`

181

``

`-

INITERROR;

`

182

``

`-

struct module_state *st = GETSTATE(module);

`

183

``

-

184

``

`-

st->error = PyErr_NewException("myextension.Error", NULL, NULL);

`

185

``

`-

if (st->error == NULL) {

`

186

``

`-

Py_DECREF(module);

`

187

``

`-

INITERROR;

`

188

``

`-

}

`

189

``

-

190

``

`-

#if PY_MAJOR_VERSION >= 3

`

191

``

`-

return module;

`

192

``

`-

#endif

`

193

``

`-

}

`

194

``

-

195

``

-

196

``

`-

CObject replaced with Capsule

`

197

``

`-

=============================

`

198

``

-

199

``

`` -

The :c:type:Capsule object was introduced in Python 3.1 and 2.7 to replace

``

200

``

`` -

:c:type:CObject. CObjects were useful,

``

201

``

`` -

but the :c:type:CObject API was problematic: it didn't permit distinguishing

``

202

``

`-

between valid CObjects, which allowed mismatched CObjects to crash the

`

203

``

`-

interpreter, and some of its APIs relied on undefined behavior in C.

`

204

``

`` -

(For further reading on the rationale behind Capsules, please see :issue:5630.)

``

205

``

-

206

``

`-

If you're currently using CObjects, and you want to migrate to 3.1 or newer,

`

207

``

`-

you'll need to switch to Capsules.

`

208

``

`` -

:c:type:CObject was deprecated in 3.1 and 2.7 and completely removed in

``

209

``

`-

Python 3.2. If you only support 2.7, or 3.1 and above, you

`

210

``

`` -

can simply switch to :c:type:Capsule. If you need to support Python 3.0,

``

211

``

`-

or versions of Python earlier than 2.7,

`

212

``

`-

you'll have to support both CObjects and Capsules.

`

213

``

`-

(Note that Python 3.0 is no longer supported, and it is not recommended

`

214

``

`-

for production use.)

`

215

``

-

216

``

`` -

The following example header file :file:capsulethunk.h may

``

217

``

`-

solve the problem for you. Simply write your code against the

`

218

``

`` -

:c:type:Capsule API and include this header file after

``

219

``

`` -

:file:Python.h. Your code will automatically use Capsules

``

220

``

`-

in versions of Python with Capsules, and switch to CObjects

`

221

``

`-

when Capsules are unavailable.

`

222

``

-

223

``

`` -

:file:capsulethunk.h simulates Capsules using CObjects. However,

``

224

``

`` -

:c:type:CObject provides no place to store the capsule's "name". As a

``

225

``

`` -

result the simulated :c:type:Capsule objects created by :file:capsulethunk.h

``

226

``

`-

behave slightly differently from real Capsules. Specifically:

`

227

``

-

228

``

`` -

``

229

``

-

230

``

`` -

``

231

``

`` -

:c:func:PyCapsule_GetPointer is ignored, and no error checking

``

232

``

`-

of the name is performed.

`

233

``

-

234

``

`` -

``

235

``

-

236

``

`` -

``

237

``

`-

returns failure. (Since there's no way to store a name

`

238

``

`` -

in a CObject, noisy failure of :c:func:PyCapsule_SetName

``

239

``

`-

was deemed preferable to silent failure here. If this is

`

240

``

`-

inconvenient, feel free to modify your local

`

241

``

`-

copy as you see fit.)

`

242

``

-

243

``

`` -

You can find :file:capsulethunk.h in the Python source distribution

``

244

``

`` -

as :source:Doc/includes/capsulethunk.h. We also include it here for

``

245

``

`-

your convenience:

`

246

``

-

247

``

`-

.. literalinclude:: ../includes/capsulethunk.h

`

248

``

-

249

``

-

250

``

-

251

``

`-

Other options

`

252

``

`-

=============

`

253

``

-

254

``

`` -

If you are writing a new extension module, you might consider `Cython

``

255

``

`` -

http://cython.org/`_. It translates a Python-like language to C. The

``

256

``

`-

extension modules it creates are compatible with Python 3 and Python 2.

`

257

``

-

``

9

`+

We recommend the following resources for porting extension modules to Python 3:

`

``

10

+

``

11

`` +

``

``

12

`+

Supporting Python 3: An in-depth guide, a book on moving from Python 2

`

``

13

`+

to Python 3 in general, guides the reader through porting an extension

`

``

14

`+

module.

`

``

15

`` +

``

``

16

`+

suggestions with supporting code.

`

``

17

`` +

``

``

18

`+

Python's C API.

`

``

19

`+

Extensions generally need to be re-written to use one of them,

`

``

20

`+

but the library then handles differences between various Python

`

``

21

`+

versions and implementations.

`

``

22

+

``

23

`+

.. _Migrating C extensions: http://python3porting.com/cextensions.html

`

``

24

`+

.. _Porting guide: https://py3c.readthedocs.io/en/latest/guide.html

`

``

25

`+

.. _Cython: http://cython.org/

`

``

26

`+

.. _CFFI: https://cffi.readthedocs.io/en/latest/

`