You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Ships GitHub Actions CI (Python 3.11 + 3.12 matrix) and a tag-driven release workflow.
Has been validated end-to-end on Python 3.12 against OVS 3.1.0 with the in-tree ryu/tests/switch/tester.py (OF1.0/1.3/1.4) and simple_switch_15 (OF1.5).
The fork is published as ryu4312 on GitHub Releases (the Python import name remains ryu for full source compatibility):
v4.35.0 — first packaging cut
v4.35.1 — includes the SCTP CRC fix
What I am proposing
Two complementary tracks, take whichever (or none) fits:
Track 1 — atomic upstream PRs. I am happy to split the work above into independent PRs against faucetsdn/ryu so each one stays digestible:
If a maintainer is willing to review and merge incrementally, I will keep submitting. I have all of these already in production-tested branches.
Track 2 — soft handoff. If maintenance bandwidth is genuinely zero, I would like to ask whether you would be open to adding a short pointer in README.rst along the lines of:
⚠️ This repository is in maintenance mode. For Python 3.11/3.12 support, see the actively maintained fork at https://github.com/olibrius/ryu4312.
That keeps the upstream history authoritative while letting downstream users discover a working install path on modern Python.
I am not asking for commit rights — only for a way to help users not silently hit ModuleNotFoundError: No module named 'distutils' on pip install ryu in 2026. Whichever track works for you (including "neither, please don't") is fine; I just wanted to surface this transparently rather than fragment the ecosystem in silence.
Thanks for everything you have done on Ryu over the years.
Project status & Python 3.12 readiness
Observation
Looking at the repository state in 2026:
master:d6cda4f(also June 2022)Meanwhile, downstream:
distutils.spawnimpdistutilsentirely and deprecatedasyncorenose(the configured test runner) no longer installs cleanly on Py3.10+eventlet< 0.33 fails to import under Py3.12sixis dead since Py2 EOL (2020)The
pip install ryustory on a fresh Python 3.12 system is currently broken end-to-end.What I did
I have been running a fork — olibrius/ryu4312 — that:
pip installon Python 3.11 / 3.12 (distutils/imp/asyncore replacements).eventletto a Py3.12-compatible release withdnspython>=2.0.nosetopytest(121,868 unit tests passing).sixdependency entirely (87 files, native Py3 idioms).ryu/tests/switch/tester.py(OF1.0/1.3/1.4) andsimple_switch_15(OF1.5).The fork is published as
ryu4312on GitHub Releases (the Python import name remainsryufor full source compatibility):What I am proposing
Two complementary tracks, take whichever (or none) fits:
Track 1 — atomic upstream PRs. I am happy to split the work above into independent PRs against
faucetsdn/ryuso each one stays digestible:distutils/imp/asyncorereplacements (Py3.10+ minimum)sixremoval (Py2 long EOL)nose→pytestmigrationeventletbump + GHA CI matrix on Py3.11/3.12If a maintainer is willing to review and merge incrementally, I will keep submitting. I have all of these already in production-tested branches.
Track 2 — soft handoff. If maintenance bandwidth is genuinely zero, I would like to ask whether you would be open to adding a short pointer in
README.rstalong the lines of:That keeps the upstream history authoritative while letting downstream users discover a working install path on modern Python.
I am not asking for commit rights — only for a way to help users not silently hit
ModuleNotFoundError: No module named 'distutils'onpip install ryuin 2026. Whichever track works for you (including "neither, please don't") is fine; I just wanted to surface this transparently rather than fragment the ecosystem in silence.Thanks for everything you have done on Ryu over the years.