python-greenlet / greenlet

Lightweight in-process concurrent programming
Other
1.63k stars 247 forks source link

greenlet under Python 3.12 #374

Closed salabim closed 11 months ago

salabim commented 11 months ago

I am trying to run a greenlet program under Python 3.12, but it doesn't seem to work. Any idea when greenlet will support Python 3.12?

fenchu commented 11 months ago
#13 50.64 Failed to build greenlet
#13 50.64 ERROR: Could not build wheels for greenlet, which is required to install pyproject.toml-based projects
#13 ERROR: process "/bin/bash -c -l cd ${INSTALL_DIR} && pip install -e ." did not complete successfully: exit code: 1

Showstopper since pip nowadays require pyprojects.toml to work with pip install -e .

jamadden commented 11 months ago

Python 3.12 is supported in greenlet 3. There are no issues with any modern version of pip so the person suggesting that is very wrong.

pamelafox commented 11 months ago

@salabim Is it possible that you have a package that's requiring an earlier version of greenlet? I just discovered that's the issue for our install, a package (playwright) requesting 2.0.2 version specifically, and then we get a wheel install error, shown below. I'm going to file an issue in playwright about it. Hopefully you can track down the issue in your requirements.

Building wheel for greenlet (setup.py) ... error
  error: subprocess-exited-with-error

  × python setup.py bdist_wheel did not run successfully.
  │ exit code: 1
  ╰─> [143 lines of output]
      running bdist_wheel
      running build
      running build_py
      creating build
      creating build/lib.linux-aarch64-cpython-312
      creating build/lib.linux-aarch64-cpython-312/greenlet
      copying src/greenlet/__init__.py -> build/lib.linux-aarch64-cpython-312/greenlet
      creating build/lib.linux-aarch64-cpython-312/greenlet/tests
      copying src/greenlet/tests/test_generator_nested.py -> build/lib.linux-aarch64-cpython-312/greenlet/tests
      copying src/greenlet/tests/test_extension_interface.py -> build/lib.linux-aarch64-cpython-312/greenlet/tests
      copying src/greenlet/tests/test_throw.py -> build/lib.linux-aarch64-cpython-312/greenlet/tests
      copying src/greenlet/tests/test_gc.py -> build/lib.linux-aarch64-cpython-312/greenlet/tests
      copying src/greenlet/tests/__init__.py -> build/lib.linux-aarch64-cpython-312/greenlet/tests
      copying src/greenlet/tests/test_leaks.py -> build/lib.linux-aarch64-cpython-312/greenlet/tests
      copying src/greenlet/tests/test_generator.py -> build/lib.linux-aarch64-cpython-312/greenlet/tests
      copying src/greenlet/tests/test_tracing.py -> build/lib.linux-aarch64-cpython-312/greenlet/tests
      copying src/greenlet/tests/test_weakref.py -> build/lib.linux-aarch64-cpython-312/greenlet/tests
      copying src/greenlet/tests/test_greenlet.py -> build/lib.linux-aarch64-cpython-312/greenlet/tests
      copying src/greenlet/tests/test_greenlet_trash.py -> build/lib.linux-aarch64-cpython-312/greenlet/tests
      copying src/greenlet/tests/test_version.py -> build/lib.linux-aarch64-cpython-312/greenlet/tests
      copying src/greenlet/tests/test_contextvars.py -> build/lib.linux-aarch64-cpython-312/greenlet/tests
      copying src/greenlet/tests/test_stack_saved.py -> build/lib.linux-aarch64-cpython-312/greenlet/tests
      copying src/greenlet/tests/leakcheck.py -> build/lib.linux-aarch64-cpython-312/greenlet/tests
      copying src/greenlet/tests/test_cpp.py -> build/lib.linux-aarch64-cpython-312/greenlet/tests
      creating build/lib.linux-aarch64-cpython-312/greenlet/platform
      copying src/greenlet/platform/__init__.py -> build/lib.linux-aarch64-cpython-312/greenlet/platform
      running egg_info
      writing src/greenlet.egg-info/PKG-INFO
      writing dependency_links to src/greenlet.egg-info/dependency_links.txt
      writing requirements to src/greenlet.egg-info/requires.txt
      writing top-level names to src/greenlet.egg-info/top_level.txt
      reading manifest file 'src/greenlet.egg-info/SOURCES.txt'
      reading manifest template 'MANIFEST.in'
      warning: no previously-included files found matching 'benchmarks/*.json'
      no previously-included directories found matching 'docs/_build'
      warning: no files found matching '*.py' under directory 'appveyor'
      warning: no previously-included files matching '*.pyc' found anywhere in distribution
      warning: no previously-included files matching '*.pyd' found anywhere in distribution
      warning: no previously-included files matching '*.so' found anywhere in distribution
      warning: no previously-included files matching '.coverage' found anywhere in distribution
      adding license file 'LICENSE'
      adding license file 'LICENSE.PSF'
      adding license file 'AUTHORS'
      writing manifest file 'src/greenlet.egg-info/SOURCES.txt'
      copying src/greenlet/greenlet.cpp -> build/lib.linux-aarch64-cpython-312/greenlet
      copying src/greenlet/greenlet.h -> build/lib.linux-aarch64-cpython-312/greenlet
      copying src/greenlet/greenlet_allocator.hpp -> build/lib.linux-aarch64-cpython-312/greenlet
      copying src/greenlet/greenlet_compiler_compat.hpp -> build/lib.linux-aarch64-cpython-312/greenlet
      copying src/greenlet/greenlet_cpython_compat.hpp -> build/lib.linux-aarch64-cpython-312/greenlet
      copying src/greenlet/greenlet_exceptions.hpp -> build/lib.linux-aarch64-cpython-312/greenlet
      copying src/greenlet/greenlet_greenlet.hpp -> build/lib.linux-aarch64-cpython-312/greenlet
      copying src/greenlet/greenlet_internal.hpp -> build/lib.linux-aarch64-cpython-312/greenlet
      copying src/greenlet/greenlet_refs.hpp -> build/lib.linux-aarch64-cpython-312/greenlet
      copying src/greenlet/greenlet_slp_switch.hpp -> build/lib.linux-aarch64-cpython-312/greenlet
      copying src/greenlet/greenlet_thread_state.hpp -> build/lib.linux-aarch64-cpython-312/greenlet
      copying src/greenlet/greenlet_thread_state_dict_cleanup.hpp -> build/lib.linux-aarch64-cpython-312/greenlet
      copying src/greenlet/greenlet_thread_support.hpp -> build/lib.linux-aarch64-cpython-312/greenlet
      copying src/greenlet/slp_platformselect.h -> build/lib.linux-aarch64-cpython-312/greenlet
      copying src/greenlet/tests/_test_extension.c -> build/lib.linux-aarch64-cpython-312/greenlet/tests
      copying src/greenlet/tests/_test_extension_cpp.cpp -> build/lib.linux-aarch64-cpython-312/greenlet/tests
      copying src/greenlet/platform/setup_switch_x64_masm.cmd -> build/lib.linux-aarch64-cpython-312/greenlet/platform
      copying src/greenlet/platform/switch_aarch64_gcc.h -> build/lib.linux-aarch64-cpython-312/greenlet/platform
      copying src/greenlet/platform/switch_alpha_unix.h -> build/lib.linux-aarch64-cpython-312/greenlet/platform
      copying src/greenlet/platform/switch_amd64_unix.h -> build/lib.linux-aarch64-cpython-312/greenlet/platform
      copying src/greenlet/platform/switch_arm32_gcc.h -> build/lib.linux-aarch64-cpython-312/greenlet/platform
      copying src/greenlet/platform/switch_arm32_ios.h -> build/lib.linux-aarch64-cpython-312/greenlet/platform
      copying src/greenlet/platform/switch_arm64_masm.asm -> build/lib.linux-aarch64-cpython-312/greenlet/platform
      copying src/greenlet/platform/switch_arm64_masm.obj -> build/lib.linux-aarch64-cpython-312/greenlet/platform
      copying src/greenlet/platform/switch_arm64_msvc.h -> build/lib.linux-aarch64-cpython-312/greenlet/platform
      copying src/greenlet/platform/switch_csky_gcc.h -> build/lib.linux-aarch64-cpython-312/greenlet/platform
      copying src/greenlet/platform/switch_m68k_gcc.h -> build/lib.linux-aarch64-cpython-312/greenlet/platform
      copying src/greenlet/platform/switch_mips_unix.h -> build/lib.linux-aarch64-cpython-312/greenlet/platform
      copying src/greenlet/platform/switch_ppc64_aix.h -> build/lib.linux-aarch64-cpython-312/greenlet/platform
      copying src/greenlet/platform/switch_ppc64_linux.h -> build/lib.linux-aarch64-cpython-312/greenlet/platform
      copying src/greenlet/platform/switch_ppc_aix.h -> build/lib.linux-aarch64-cpython-312/greenlet/platform
      copying src/greenlet/platform/switch_ppc_linux.h -> build/lib.linux-aarch64-cpython-312/greenlet/platform
      copying src/greenlet/platform/switch_ppc_macosx.h -> build/lib.linux-aarch64-cpython-312/greenlet/platform
      copying src/greenlet/platform/switch_ppc_unix.h -> build/lib.linux-aarch64-cpython-312/greenlet/platform
      copying src/greenlet/platform/switch_riscv_unix.h -> build/lib.linux-aarch64-cpython-312/greenlet/platform
      copying src/greenlet/platform/switch_s390_unix.h -> build/lib.linux-aarch64-cpython-312/greenlet/platform
      copying src/greenlet/platform/switch_sparc_sun_gcc.h -> build/lib.linux-aarch64-cpython-312/greenlet/platform
      copying src/greenlet/platform/switch_x32_unix.h -> build/lib.linux-aarch64-cpython-312/greenlet/platform
      copying src/greenlet/platform/switch_x64_masm.asm -> build/lib.linux-aarch64-cpython-312/greenlet/platform
      copying src/greenlet/platform/switch_x64_masm.obj -> build/lib.linux-aarch64-cpython-312/greenlet/platform
      copying src/greenlet/platform/switch_x64_msvc.h -> build/lib.linux-aarch64-cpython-312/greenlet/platform
      copying src/greenlet/platform/switch_x86_msvc.h -> build/lib.linux-aarch64-cpython-312/greenlet/platform
      copying src/greenlet/platform/switch_x86_unix.h -> build/lib.linux-aarch64-cpython-312/greenlet/platform
      running build_ext
      building 'greenlet._greenlet' extension
      creating build/temp.linux-aarch64-cpython-312
      creating build/temp.linux-aarch64-cpython-312/src
      creating build/temp.linux-aarch64-cpython-312/src/greenlet
      gcc -fno-strict-overflow -Wsign-compare -DNDEBUG -g -O3 -Wall -fPIC -I/usr/local/include/python3.12 -c src/greenlet/greenlet.cpp -o build/temp.linux-aarch64-cpython-312/src/greenlet/greenlet.o
      In file included from src/greenlet/greenlet_internal.hpp:20,
                       from src/greenlet/greenlet.cpp:19:
      src/greenlet/greenlet_greenlet.hpp: In member function ‘void greenlet::PythonState::operator<<(const PyThreadState*)’:
      src/greenlet/greenlet_greenlet.hpp:831:41: error: ‘_PyCFrame’ {aka ‘struct _PyCFrame’} has no member named ‘use_tracing’
        831 |     this->use_tracing = tstate->cframe->use_tracing;
            |                                         ^~~~~~~~~~~
      src/greenlet/greenlet_greenlet.hpp:834:37: error: ‘const PyThreadState’ {aka ‘const struct _ts’} has no member named ‘recursion_limit’; did you mean ‘py_recursion_limit’?
        834 |     this->recursion_depth = tstate->recursion_limit - tstate->recursion_remaining;
            |                                     ^~~~~~~~~~~~~~~
            |                                     py_recursion_limit
      src/greenlet/greenlet_greenlet.hpp:834:63: error: ‘const PyThreadState’ {aka ‘const struct _ts’} has no member named ‘recursion_remaining’; did you mean ‘c_recursion_remaining’?
        834 |     this->recursion_depth = tstate->recursion_limit - tstate->recursion_remaining;
            |                                                               ^~~~~~~~~~~~~~~~~~~
            |                                                               c_recursion_remaining
      src/greenlet/greenlet_greenlet.hpp:848:42: error: ‘const PyThreadState’ {aka ‘const struct _ts’} has no member named ‘trash_delete_nesting’
        848 |     this->trash_delete_nesting = tstate->trash_delete_nesting;
            |                                          ^~~~~~~~~~~~~~~~~~~~
      src/greenlet/greenlet_greenlet.hpp: In member function ‘void greenlet::PythonState::operator>>(PyThreadState*)’:
      src/greenlet/greenlet_greenlet.hpp:867:21: error: ‘_PyCFrame’ {aka ‘struct _PyCFrame’} has no member named ‘use_tracing’
        867 |     tstate->cframe->use_tracing = this->use_tracing;
            |                     ^~~~~~~~~~~
      src/greenlet/greenlet_greenlet.hpp:870:13: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘recursion_remaining’; did you mean ‘c_recursion_remaining’?
        870 |     tstate->recursion_remaining = tstate->recursion_limit - this->recursion_depth;
            |             ^~~~~~~~~~~~~~~~~~~
            |             c_recursion_remaining
      src/greenlet/greenlet_greenlet.hpp:870:43: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘recursion_limit’; did you mean ‘py_recursion_limit’?
        870 |     tstate->recursion_remaining = tstate->recursion_limit - this->recursion_depth;
            |                                           ^~~~~~~~~~~~~~~
            |                                           py_recursion_limit
      src/greenlet/greenlet_greenlet.hpp:881:13: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘trash_delete_nesting’
        881 |     tstate->trash_delete_nesting = this->trash_delete_nesting;
            |             ^~~~~~~~~~~~~~~~~~~~
      src/greenlet/greenlet_greenlet.hpp: In member function ‘void greenlet::PythonState::will_switch_from(PyThreadState*)’:
      src/greenlet/greenlet_greenlet.hpp:891:48: error: ‘_PyCFrame’ {aka ‘struct _PyCFrame’} has no member named ‘use_tracing’
        891 |     this->use_tracing = origin_tstate->cframe->use_tracing;
            |                                                ^~~~~~~~~~~
      src/greenlet/greenlet_greenlet.hpp: In member function ‘void greenlet::PythonState::set_initial_state(const PyThreadState*)’:
      src/greenlet/greenlet_greenlet.hpp:899:37: error: ‘const PyThreadState’ {aka ‘const struct _ts’} has no member named ‘recursion_limit’; did you mean ‘py_recursion_limit’?
        899 |     this->recursion_depth = tstate->recursion_limit - tstate->recursion_remaining;
            |                                     ^~~~~~~~~~~~~~~
            |                                     py_recursion_limit
      src/greenlet/greenlet_greenlet.hpp:899:63: error: ‘const PyThreadState’ {aka ‘const struct _ts’} has no member named ‘recursion_remaining’; did you mean ‘c_recursion_remaining’?
        899 |     this->recursion_depth = tstate->recursion_limit - tstate->recursion_remaining;
            |                                                               ^~~~~~~~~~~~~~~~~~~
            |                                                               c_recursion_remaining
      src/greenlet/greenlet.cpp: In function ‘PyObject* mod_get_tstate_trash_delete_nesting(PyObject*)’:
      src/greenlet/greenlet.cpp:3095:36: error: ‘PyThreadState’ {aka ‘struct _ts’} has no member named ‘trash_delete_nesting’
       3095 |     return PyLong_FromLong(tstate->trash_delete_nesting);
            |                                    ^~~~~~~~~~~~~~~~~~~~
      error: command '/usr/bin/gcc' failed with exit code 1
      [end of output]

  note: This error originates from a subprocess, and is likely not a problem with pip.
  ERROR: Failed building wheel for greenlet
salabim commented 11 months ago

Solved. Greenlet did not work with Python 3.12.0a2, but it works properly under Python 3.12.0.