Skip to content

Compatibility with Python 3.11 and greenlet 2.0.0 #1867

@hrnciar

Description

@hrnciar
  • gevent version: 21.12.0 using Fedora's RPM package
  • greenlet version: 2.0.0a1
  • Python version: 3.11.0a5
  • Cython version: 3.0.0a10
  • Operating System: Fedora Rawhide

Description:

In Fedora, we are doing rebuilds of all Python packages with development versions of Python 3.11, currently 5th alpha.
Python 3.11 brings some backwards-incompatible changes that affect greenlet. Greenlet developers have already fixed some issues and greenlet 2.0.0a1 builds with Python 3.11. When I tried to build gevent in this setup I've got this error:

src/gevent/greenlet.c: In function ‘__pyx_f_6gevent_17_gevent_cgreenlet__extract_stack’:
src/gevent/greenlet.c:6218:43: error: ‘PyFrameObject’ {aka ‘struct _frame’} has no member named ‘f_code’
 6218 |     __pyx_t_6 = ((PyObject *)__pyx_v_frame->f_code);
      |                                           ^~
src/gevent/greenlet.c: In function ‘__pyx_f_6gevent_17_gevent_cgreenlet_get_generic_parent’:
src/gevent/greenlet.c:19924:26: error: ‘PyGreenlet’ {aka ‘struct _greenlet’} has no member named ‘parent’
19924 |   __pyx_t_1 = ((__pyx_v_s->parent != NULL) != 0);
      |                          ^~
In file included from /usr/include/python3.11/Python.h:42,
                 from src/gevent/greenlet.c:37:
src/gevent/greenlet.c:19935:40: error: ‘PyGreenlet’ {aka ‘struct _greenlet’} has no member named ‘parent’
19935 |     __Pyx_INCREF(((PyObject *)__pyx_v_s->parent));
      |                                        ^~
/usr/include/python3.11/object.h:112:41: note: in definition of macro ‘_PyObject_CAST’
  112 | #define _PyObject_CAST(op) ((PyObject*)(op))
      |                                         ^~
./src/gevent/_generated_include/Refnanny_proto_251246e7dae1dc172351bab7073efbf5de224e2b.h:50:27: note: in expansion of macro ‘Py_INCREF’
   50 |   #define __Pyx_INCREF(r) Py_INCREF(r)
      |                           ^~~~~~~~~
src/gevent/greenlet.c:19935:5: note: in expansion of macro ‘__Pyx_INCREF’
19935 |     __Pyx_INCREF(((PyObject *)__pyx_v_s->parent));
      |     ^~~~~~~~~~~~
src/gevent/greenlet.c:19936:37: error: ‘PyGreenlet’ {aka ‘struct _greenlet’} has no member named ‘parent’
19936 |     __pyx_r = ((PyObject *)__pyx_v_s->parent);
      |                                     ^~
src/gevent/greenlet.c: In function ‘__pyx_f_6gevent_17_gevent_cgreenlet_get_my_hub’:
src/gevent/greenlet.c:19988:26: error: ‘PyGreenlet’ {aka ‘struct _greenlet’} has no member named ‘parent’
19988 |   __pyx_t_1 = ((__pyx_v_s->parent != NULL) != 0);
      |                          ^~
src/gevent/greenlet.c:19999:42: error: ‘PyGreenlet’ {aka ‘struct _greenlet’} has no member named ‘parent’
19999 |     if (!(likely(((((PyObject *)__pyx_v_s->parent)) == Py_None) || likely(__Pyx_TypeTest(((PyObject *)__pyx_v_s->parent), __pyx_ptype_6gevent_29_gevent_c_greenlet_primitives_SwitchOutGreenletWithLoop))))) __PYX_ERR(1, 45, __pyx_L1_error)
      |                                          ^~
src/gevent/greenlet.c:1156:43: note: in definition of macro ‘likely’
 1156 |   #define likely(x)   __builtin_expect(!!(x), 1)
      |                                           ^
src/gevent/greenlet.c:19999:112: error: ‘PyGreenlet’ {aka ‘struct _greenlet’} has no member named ‘parent’
19999 |     if (!(likely(((((PyObject *)__pyx_v_s->parent)) == Py_None) || likely(__Pyx_TypeTest(((PyObject *)__pyx_v_s->parent), __pyx_ptype_6gevent_29_gevent_c_greenlet_primitives_SwitchOutGreenletWithLoop))))) __PYX_ERR(1, 45, __pyx_L1_error)
      |                                                                                                                ^~
src/gevent/greenlet.c:1156:43: note: in definition of macro ‘likely’
 1156 |   #define likely(x)   __builtin_expect(!!(x), 1)
      |                                           ^
src/gevent/greenlet.c:19999:68: note: in expansion of macro ‘likely’
19999 |     if (!(likely(((((PyObject *)__pyx_v_s->parent)) == Py_None) || likely(__Pyx_TypeTest(((PyObject *)__pyx_v_s->parent), __pyx_ptype_6gevent_29_gevent_c_greenlet_primitives_SwitchOutGreenletWithLoop))))) __PYX_ERR(1, 45, __pyx_L1_error)
      |                                                                    ^~~~~~
src/gevent/greenlet.c:20000:40: error: ‘PyGreenlet’ {aka ‘struct _greenlet’} has no member named ‘parent’
20000 |     __Pyx_INCREF(((PyObject *)__pyx_v_s->parent));
      |                                        ^~
/usr/include/python3.11/object.h:112:41: note: in definition of macro ‘_PyObject_CAST’
  112 | #define _PyObject_CAST(op) ((PyObject*)(op))
      |                                         ^~
./src/gevent/_generated_include/Refnanny_proto_251246e7dae1dc172351bab7073efbf5de224e2b.h:50:27: note: in expansion of macro ‘Py_INCREF’
   50 |   #define __Pyx_INCREF(r) Py_INCREF(r)
      |                           ^~~~~~~~~
src/gevent/greenlet.c:20000:5: note: in expansion of macro ‘__Pyx_INCREF’
20000 |     __Pyx_INCREF(((PyObject *)__pyx_v_s->parent));
      |     ^~~~~~~~~~~~
src/gevent/greenlet.c:20001:124: error: ‘PyGreenlet’ {aka ‘struct _greenlet’} has no member named ‘parent’
20001 |     __pyx_r = ((struct __pyx_obj_6gevent_29_gevent_c_greenlet_primitives_SwitchOutGreenletWithLoop *)((PyObject *)__pyx_v_s->parent));
      |                                                                                                                            ^~

You can see full log here https://download.copr.fedorainfracloud.org/results/@python/python3.11/fedora-rawhide-x86_64/03415430-python-gevent/builder-live.log.gz .

I am not well oriented in greenlet/gevent relationship, but I think that greenlet changed some internals and gevent needs to be adapted.
Plenty of packages depends on gevent and we cannot test them with Python 3.11 without this dependency. I would like to kindly ask for help how to fix gevent. I understand that it is just 1st alpha of greenlet and it can change in the future, but for now, some dirty patch would be sufficient, just to unblock gevent. Thank you.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions