1 
2 /* Interfaces to configure, query, create & destroy the Python runtime */
3 
4 #ifndef Py_PYLIFECYCLE_H
5 #define Py_PYLIFECYCLE_H
6 #ifdef __cplusplus
7 extern "C" {
8 #endif
9 
10 #ifndef Py_LIMITED_API
11 typedef struct {
12     const char *prefix;
13     const char *msg;
14     int user_err;
15 } _PyInitError;
16 
17 /* Almost all errors causing Python initialization to fail */
18 #ifdef _MSC_VER
19    /* Visual Studio 2015 doesn't implement C99 __func__ in C */
20 #  define _Py_INIT_GET_FUNC() __FUNCTION__
21 #else
22 #  define _Py_INIT_GET_FUNC() __func__
23 #endif
24 
25 #define _Py_INIT_OK() \
26     (_PyInitError){.prefix = NULL, .msg = NULL, .user_err = 0}
27 #define _Py_INIT_ERR(MSG) \
28     (_PyInitError){.prefix = _Py_INIT_GET_FUNC(), .msg = (MSG), .user_err = 0}
29 /* Error that can be fixed by the user like invalid input parameter.
30    Don't abort() the process on such error. */
31 #define _Py_INIT_USER_ERR(MSG) \
32     (_PyInitError){.prefix = _Py_INIT_GET_FUNC(), .msg = (MSG), .user_err = 1}
33 #define _Py_INIT_NO_MEMORY() _Py_INIT_USER_ERR("memory allocation failed")
34 #define _Py_INIT_FAILED(err) \
35     (err.msg != NULL)
36 
37 #endif
38 
39 
40 PyAPI_FUNC(void) Py_SetProgramName(const wchar_t *);
41 PyAPI_FUNC(wchar_t *) Py_GetProgramName(void);
42 
43 PyAPI_FUNC(void) Py_SetPythonHome(const wchar_t *);
44 PyAPI_FUNC(wchar_t *) Py_GetPythonHome(void);
45 
46 #ifndef Py_LIMITED_API
47 PyAPI_FUNC(void) _Py_SetProgramFullPath(const wchar_t *);
48 
49 /* Only used by applications that embed the interpreter and need to
50  * override the standard encoding determination mechanism
51  */
52 PyAPI_FUNC(int) Py_SetStandardStreamEncoding(const char *encoding,
53                                              const char *errors);
54 
55 /* PEP 432 Multi-phase initialization API (Private while provisional!) */
56 PyAPI_FUNC(_PyInitError) _Py_InitializeCore(
57     PyInterpreterState **interp_p,
58     const _PyCoreConfig *config);
59 PyAPI_FUNC(int) _Py_IsCoreInitialized(void);
60 PyAPI_FUNC(_PyInitError) _Py_InitializeFromConfig(
61     const _PyCoreConfig *config);
62 #ifdef Py_BUILD_CORE
63 PyAPI_FUNC(void) _Py_Initialize_ReadEnvVarsNoAlloc(void);
64 #endif
65 
66 PyAPI_FUNC(PyObject *) _Py_GetGlobalVariablesAsDict(void);
67 
68 PyAPI_FUNC(_PyInitError) _PyCoreConfig_Read(_PyCoreConfig *);
69 PyAPI_FUNC(void) _PyCoreConfig_Clear(_PyCoreConfig *);
70 PyAPI_FUNC(int) _PyCoreConfig_Copy(
71     _PyCoreConfig *config,
72     const _PyCoreConfig *config2);
73 PyAPI_FUNC(PyObject *) _PyCoreConfig_AsDict(const _PyCoreConfig *config);
74 PyAPI_FUNC(void) _PyCoreConfig_SetGlobalConfig(
75     const _PyCoreConfig *config);
76 
77 
78 PyAPI_FUNC(_PyInitError) _PyMainInterpreterConfig_Read(
79     _PyMainInterpreterConfig *config,
80     const _PyCoreConfig *core_config);
81 PyAPI_FUNC(void) _PyMainInterpreterConfig_Clear(_PyMainInterpreterConfig *);
82 PyAPI_FUNC(int) _PyMainInterpreterConfig_Copy(
83     _PyMainInterpreterConfig *config,
84     const _PyMainInterpreterConfig *config2);
85 /* Used by _testcapi.get_main_config() */
86 PyAPI_FUNC(PyObject*) _PyMainInterpreterConfig_AsDict(
87     const _PyMainInterpreterConfig *config);
88 
89 PyAPI_FUNC(_PyInitError) _Py_InitializeMainInterpreter(
90         PyInterpreterState *interp,
91         const _PyMainInterpreterConfig *config);
92 #endif   /* !defined(Py_LIMITED_API) */
93 
94 
95 /* Initialization and finalization */
96 PyAPI_FUNC(void) Py_Initialize(void);
97 PyAPI_FUNC(void) Py_InitializeEx(int);
98 #ifndef Py_LIMITED_API
99 PyAPI_FUNC(void) _Py_FatalInitError(_PyInitError err) _Py_NO_RETURN;
100 #endif
101 PyAPI_FUNC(void) Py_Finalize(void);
102 #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03060000
103 PyAPI_FUNC(int) Py_FinalizeEx(void);
104 #endif
105 PyAPI_FUNC(int) Py_IsInitialized(void);
106 
107 /* Subinterpreter support */
108 PyAPI_FUNC(PyThreadState *) Py_NewInterpreter(void);
109 PyAPI_FUNC(void) Py_EndInterpreter(PyThreadState *);
110 
111 
112 /* Py_PyAtExit is for the atexit module, Py_AtExit is for low-level
113  * exit functions.
114  */
115 #ifndef Py_LIMITED_API
116 PyAPI_FUNC(void) _Py_PyAtExit(void (*func)(PyObject *), PyObject *);
117 #endif
118 PyAPI_FUNC(int) Py_AtExit(void (*func)(void));
119 
120 PyAPI_FUNC(void) Py_Exit(int) _Py_NO_RETURN;
121 
122 /* Restore signals that the interpreter has called SIG_IGN on to SIG_DFL. */
123 #ifndef Py_LIMITED_API
124 PyAPI_FUNC(void) _Py_RestoreSignals(void);
125 
126 PyAPI_FUNC(int) Py_FdIsInteractive(FILE *, const char *);
127 #endif
128 
129 /* Bootstrap __main__ (defined in Modules/main.c) */
130 PyAPI_FUNC(int) Py_Main(int argc, wchar_t **argv);
131 #ifdef Py_BUILD_CORE
132 PyAPI_FUNC(int) _Py_UnixMain(int argc, char **argv);
133 #endif
134 
135 /* In getpath.c */
136 PyAPI_FUNC(wchar_t *) Py_GetProgramFullPath(void);
137 PyAPI_FUNC(wchar_t *) Py_GetPrefix(void);
138 PyAPI_FUNC(wchar_t *) Py_GetExecPrefix(void);
139 PyAPI_FUNC(wchar_t *) Py_GetPath(void);
140 #ifdef Py_BUILD_CORE
141 PyAPI_FUNC(_PyInitError) _PyPathConfig_Init(const _PyCoreConfig *core_config);
142 PyAPI_FUNC(int) _PyPathConfig_ComputeArgv0(
143     int argc, wchar_t **argv,
144     PyObject **argv0_p);
145 PyAPI_FUNC(int) _Py_FindEnvConfigValue(
146     FILE *env_file,
147     const wchar_t *key,
148     wchar_t *value,
149     size_t value_size);
150 #endif
151 PyAPI_FUNC(void)      Py_SetPath(const wchar_t *);
152 #ifdef MS_WINDOWS
153 int _Py_CheckPython3(void);
154 #endif
155 
156 /* In their own files */
157 PyAPI_FUNC(const char *) Py_GetVersion(void);
158 PyAPI_FUNC(const char *) Py_GetPlatform(void);
159 PyAPI_FUNC(const char *) Py_GetCopyright(void);
160 PyAPI_FUNC(const char *) Py_GetCompiler(void);
161 PyAPI_FUNC(const char *) Py_GetBuildInfo(void);
162 #ifndef Py_LIMITED_API
163 PyAPI_FUNC(const char *) _Py_gitidentifier(void);
164 PyAPI_FUNC(const char *) _Py_gitversion(void);
165 #endif
166 
167 /* Internal -- various one-time initializations */
168 #ifndef Py_LIMITED_API
169 PyAPI_FUNC(PyObject *) _PyBuiltin_Init(void);
170 PyAPI_FUNC(_PyInitError) _PySys_BeginInit(PyObject **sysmod);
171 PyAPI_FUNC(int) _PySys_EndInit(PyObject *sysdict, _PyMainInterpreterConfig *config);
172 PyAPI_FUNC(_PyInitError) _PyImport_Init(PyInterpreterState *interp);
173 PyAPI_FUNC(void) _PyExc_Init(PyObject * bltinmod);
174 PyAPI_FUNC(_PyInitError) _PyImportHooks_Init(void);
175 PyAPI_FUNC(int) _PyFrame_Init(void);
176 PyAPI_FUNC(int) _PyFloat_Init(void);
177 PyAPI_FUNC(int) PyByteArray_Init(void);
178 PyAPI_FUNC(_PyInitError) _Py_HashRandomization_Init(const _PyCoreConfig *);
179 #endif
180 #ifdef Py_BUILD_CORE
181 PyAPI_FUNC(int) _Py_ReadHashSeed(
182     const char *seed_text,
183     int *use_hash_seed,
184     unsigned long *hash_seed);
185 #endif
186 
187 /* Various internal finalizers */
188 
189 #ifdef Py_BUILD_CORE
190 PyAPI_FUNC(void) _PyExc_Fini(void);
191 PyAPI_FUNC(void) _PyImport_Fini(void);
192 PyAPI_FUNC(void) _PyImport_Fini2(void);
193 PyAPI_FUNC(void) _PyGC_DumpShutdownStats(void);
194 PyAPI_FUNC(void) _PyGC_Fini(void);
195 PyAPI_FUNC(void) _PyType_Fini(void);
196 PyAPI_FUNC(void) _Py_HashRandomization_Fini(void);
197 #endif   /* Py_BUILD_CORE */
198 
199 #ifndef Py_LIMITED_API
200 PyAPI_FUNC(void) PyMethod_Fini(void);
201 PyAPI_FUNC(void) PyFrame_Fini(void);
202 PyAPI_FUNC(void) PyCFunction_Fini(void);
203 PyAPI_FUNC(void) PyDict_Fini(void);
204 PyAPI_FUNC(void) PyTuple_Fini(void);
205 PyAPI_FUNC(void) PyList_Fini(void);
206 PyAPI_FUNC(void) PySet_Fini(void);
207 PyAPI_FUNC(void) PyBytes_Fini(void);
208 PyAPI_FUNC(void) PyByteArray_Fini(void);
209 PyAPI_FUNC(void) PyFloat_Fini(void);
210 PyAPI_FUNC(void) PyOS_FiniInterrupts(void);
211 PyAPI_FUNC(void) PySlice_Fini(void);
212 PyAPI_FUNC(void) PyAsyncGen_Fini(void);
213 
214 PyAPI_FUNC(int) _Py_IsFinalizing(void);
215 #endif   /* !Py_LIMITED_API */
216 
217 /* Signals */
218 typedef void (*PyOS_sighandler_t)(int);
219 PyAPI_FUNC(PyOS_sighandler_t) PyOS_getsig(int);
220 PyAPI_FUNC(PyOS_sighandler_t) PyOS_setsig(int, PyOS_sighandler_t);
221 
222 #ifndef Py_LIMITED_API
223 /* Random */
224 PyAPI_FUNC(int) _PyOS_URandom(void *buffer, Py_ssize_t size);
225 PyAPI_FUNC(int) _PyOS_URandomNonblock(void *buffer, Py_ssize_t size);
226 #endif /* !Py_LIMITED_API */
227 
228 /* Legacy locale support */
229 #ifndef Py_LIMITED_API
230 PyAPI_FUNC(void) _Py_CoerceLegacyLocale(const _PyCoreConfig *config);
231 PyAPI_FUNC(int) _Py_LegacyLocaleDetected(void);
232 PyAPI_FUNC(char *) _Py_SetLocaleFromEnv(int category);
233 #endif
234 
235 #ifdef __cplusplus
236 }
237 #endif
238 #endif /* !Py_PYLIFECYCLE_H */
239