| Library | Cross-Platform | Headless | Status | Notes | |----------------------------------------------------------------------|----------------|----------|---------------------|------------------------------------------------------------| | https://pysdl2.readthedocs.io/ | Yes | Yes | Active | Can init only joystick/controller subsystems without video | | https://github.com/zeth/inputs | Yes | Yes | Unmaintained (2019) | Reported issues on macOS | | https://pyglet.readthedocs.io/en/latest/programming_guide/input.html | Yes | No | Active | Requires event loop + window | | https://www.pygame.org/docs/ref/joystick.html | Yes | No | Active | Requires SDL video init | | https://python-evdev.readthedocs.io/en/latest/ | Linux only | Yes | Active | Very clean API | For headless ezmsg integration, PySDL2 seems best because: - Can run without a window: sdl2.SDL_Init(sdl2.SDL_INIT_GAMECONTROLLER) - Cross-platform (Windows, macOS, Linux) - Uses battle-tested SDL2 under the hood - See https://github.com/py-sdl/py-sdl2/issues/171 for an example Joystick implementation Additional info: * https://courses.ideate.cmu.edu/16-375/f2025/text/python/gamepad.html * https://wiki.libsdl.org/SDL3/CategoryGamepad
For headless ezmsg integration, PySDL2 seems best because:
Additional info: