GDAL
gdalpython.h
1/******************************************************************************
2 *
3 * Project: GDAL Core
4 * Purpose: Python interface
5 * Author: Even Rouault, <even dot rouault at spatialys dot com>
6 *
7 ******************************************************************************
8 * Copyright (c) 2017-2019, Even Rouault, <even dot rouault at spatialys dot
9 *com>
10 *
11 * SPDX-License-Identifier: MIT
12 ****************************************************************************/
13
14#ifndef GDALPYTHON_H_INCLUDED
15#define GDALPYTHON_H_INCLUDED
16
17#include "cpl_string.h"
18#include <cwchar>
19
20bool GDALPythonInitialize();
21
22void GDALPythonFinalize();
23
25
26// Subset of Python API defined as function pointers
27// Only use the below function pointers if GDALPythonInitialize() succeeds
28namespace GDALPy
29{
30typedef struct _object PyObject;
31typedef size_t Py_ssize_t;
32
33extern int (*Py_IsInitialized)(void);
34extern void (*Py_SetProgramName)(const wchar_t *);
35extern void (*Py_SetPythonHome)(const wchar_t *);
36extern PyObject *(*PyObject_Type)(PyObject *);
37extern int (*PyObject_IsInstance)(PyObject *, PyObject *);
38extern PyObject *(*PyTuple_New)(size_t);
39extern PyObject *(*PyBool_FromLong)(long);
40extern PyObject *(*PyLong_FromLong)(long);
41extern long (*PyLong_AsLong)(PyObject *);
42extern PyObject *(*PyLong_FromLongLong)(GIntBig);
43extern GIntBig (*PyLong_AsLongLong)(PyObject *);
44extern PyObject *(*PyFloat_FromDouble)(double);
45extern double (*PyFloat_AsDouble)(PyObject *);
46extern PyObject *(*PyObject_Call)(PyObject *, PyObject *, PyObject *);
47extern PyObject *(*PyObject_GetIter)(PyObject *);
48extern PyObject *(*PyIter_Next)(PyObject *);
49extern void (*Py_IncRef)(PyObject *);
50extern void (*Py_DecRef)(PyObject *);
51extern PyObject *(*PyErr_Occurred)(void);
52extern void (*PyErr_Print)(void);
53
54extern PyObject *(*Py_CompileString)(const char *, const char *, int);
55extern PyObject *(*PyImport_ExecCodeModule)(const char *, PyObject *);
56extern int (*PyObject_HasAttrString)(PyObject *, const char *);
57extern PyObject *(*PyObject_GetAttrString)(PyObject *, const char *);
58extern int (*PyObject_SetAttrString)(PyObject *, const char *, PyObject *);
59extern int (*PyTuple_SetItem)(PyObject *, size_t, PyObject *);
60extern void (*PyObject_Print)(PyObject *, FILE *, int);
61
62extern Py_ssize_t (*PyBytes_Size)(PyObject *);
63extern const char *(*PyBytes_AsString)(PyObject *);
64extern int *(*PyBytes_AsStringAndSize)(PyObject *, char **, Py_ssize_t *);
65extern PyObject *(*PyBytes_FromObject)(PyObject *);
66extern PyObject *(*PyBytes_FromStringAndSize)(const void *, size_t);
67
68extern PyObject *(*PyUnicode_FromString)(const char *);
69extern PyObject *(*PyUnicode_AsUTF8String)(PyObject *);
70extern PyObject *(*PyImport_ImportModule)(const char *);
71extern int (*PyCallable_Check)(PyObject *);
72extern PyObject *(*PyDict_New)(void);
73extern int (*PyDict_SetItemString)(PyObject *p, const char *key, PyObject *val);
74extern int (*PyDict_Next)(PyObject *p, size_t *, PyObject **, PyObject **);
75extern PyObject *(*PyDict_GetItemString)(PyObject *p, const char *key);
76extern PyObject *(*PyList_New)(Py_ssize_t);
77extern int (*PyList_SetItem)(PyObject *, Py_ssize_t, PyObject *);
78extern int (*PyArg_ParseTuple)(PyObject *, const char *, ...);
79
80extern int (*PySequence_Check)(PyObject *o);
81extern Py_ssize_t (*PySequence_Size)(PyObject *o);
82extern PyObject *(*PySequence_GetItem)(PyObject *o, Py_ssize_t i);
83
84extern void (*PyErr_Fetch)(PyObject **poPyType, PyObject **poPyValue,
85 PyObject **poPyTraceback);
86extern void (*PyErr_Clear)(void);
87extern const char *(*Py_GetVersion)(void);
88
89typedef struct
90{
91 // cppcheck-suppress unusedStructMember
92 char big_enough[256];
93} Py_buffer;
94
95extern int (*PyBuffer_FillInfo)(Py_buffer *view, PyObject *obj, void *buf,
96 size_t len, int readonly, int infoflags);
97extern PyObject *(*PyMemoryView_FromBuffer)(Py_buffer *view);
98
99typedef PyObject *(*PyCFunction)(PyObject *, PyObject *, PyObject *);
100
101typedef struct PyMethodDef PyMethodDef;
102
103struct PyMethodDef
104{
105 const char *name;
106 PyCFunction function;
107 int flags;
108 const char *help;
109};
110
111extern PyObject *(*PyCFunction_New)(const PyMethodDef *ml, PyObject *self);
112extern int (*PyModule_AddObject)(PyObject *mod, const char *name,
113 PyObject *value);
114
115#define METH_VARARGS 0x0001
116#define METH_KEYWORDS 0x0002
117
118#define Py_file_input 257
119
120typedef int PyGILState_STATE;
121
122class GIL_Holder
123{
124 bool m_bExclusiveLock;
125 PyGILState_STATE m_eState = 0;
126
127 public:
128 explicit GIL_Holder(bool bExclusiveLock);
129 virtual ~GIL_Holder();
130};
131
132CPLString GetString(PyObject *obj, bool bEmitError = true);
133CPLString GetPyExceptionString();
134bool ErrOccurredEmitCPLError();
135
136} // namespace GDALPy
137
139
140#endif
long long GIntBig
Large signed integer type (generally 64-bit integer type).
Definition cpl_port.h:205
Various convenience functions for working with strings and string lists.