uwsgi/uwsgi_python312-2.patch
2024-01-23 21:35:44 +01:00

82 lines
2.1 KiB
Diff

diff --git a/plugins/python/python_plugin.c b/plugins/python/python_plugin.c
index de92f34c..08d99a96 100644
--- a/plugins/python/python_plugin.c
+++ b/plugins/python/python_plugin.c
@@ -233,21 +233,6 @@ void uwsgi_python_pthread_child(void) {
PyMethodDef uwsgi_spit_method[] = { {"uwsgi_spit", py_uwsgi_spit, METH_VARARGS, ""} };
PyMethodDef uwsgi_write_method[] = { {"uwsgi_write", py_uwsgi_write, METH_VARARGS, ""} };
-PyDoc_STRVAR(uwsgi_py_doc, "uWSGI api module.");
-
-#ifdef PYTHREE
-static PyModuleDef uwsgi_module3 = {
- PyModuleDef_HEAD_INIT,
- "uwsgi",
- uwsgi_py_doc,
- -1,
- NULL,
-};
-PyObject *init_uwsgi3(void) {
- return PyModule_Create(&uwsgi_module3);
-}
-#endif
-
int uwsgi_python_init() {
char *pyversion = strchr(Py_GetVersion(), '\n');
@@ -313,9 +298,6 @@ pep405:
wchar_t *pname = uwsgi_calloc(sizeof(wchar_t) * (strlen(program_name)+1));
mbstowcs(pname, program_name, strlen(program_name)+1);
Py_SetProgramName(pname);
-#ifdef UWSGI_PY312
- PyImport_AppendInittab("uwsgi", init_uwsgi3);
-#endif
#else
Py_SetProgramName(program_name);
#endif
@@ -678,6 +660,21 @@ next:
+PyDoc_STRVAR(uwsgi_py_doc, "uWSGI api module.");
+
+#ifdef PYTHREE
+static PyModuleDef uwsgi_module3 = {
+ PyModuleDef_HEAD_INIT,
+ "uwsgi",
+ uwsgi_py_doc,
+ -1,
+ NULL,
+};
+PyObject *init_uwsgi3(void) {
+ return PyModule_Create(&uwsgi_module3);
+}
+#endif
+
void init_uwsgi_embedded_module() {
PyObject *new_uwsgi_module, *zero;
int i;
@@ -698,10 +695,21 @@ void init_uwsgi_embedded_module() {
#ifdef PYTHREE
-#ifndef UWSGI_PY312
+# ifndef UWSGI_PY312
PyImport_AppendInittab("uwsgi", init_uwsgi3);
-#endif
new_uwsgi_module = PyImport_AddModule("uwsgi");
+# else
+ // From python 3.12 onwards, PyImport_AppendInittab() can no
+ // longer be called after Py_Initialize(). Instead, dynamically
+ // add the module instead
+ PyObject *sys_modules;
+ PyImport_AddModule("uwsgi");
+ new_uwsgi_module = init_uwsgi3();
+ sys_modules = PyImport_GetModuleDict();
+ PyDict_SetItemString(sys_modules, "uwsgi", new_uwsgi_module);
+ Py_DECREF(new_uwsgi_module);
+
+# endif
#else
new_uwsgi_module = Py_InitModule3("uwsgi", NULL, uwsgi_py_doc);
#endif