Pyglet's OpenGL bindings should support very recent versions. (If not, please file a bug so that they can be updated).
Internally, Pyglet only uses "classic" OpenGL. This older OpenGL is much simpler, and is enough for most simple games and applications. This is what the pyglet text, sprite, and graphics modules are based on.
Modern OpenGL can be used by simply requesting a newer OpenGL context when creating the window. However, you have to give up on the sprite and graphics modules because they will try to call some older OpenGL functions that may not be available with a newer context.
Working with shaders does require knowing some ctypes, but there is a nice library here that hides that:
https://github.com/gabdube/pyshadersI also wrote a very basic shader program wrapper here:
https://bitbucket.org/treehousegames/pyglet/src/28d33a50ba8c1f140613ca90de7791260a3d9daa/pyglet/graphics/shader.py?at=shader_class&fileviewer=file-view-defaultI would probably not recommend the one i wrote, but it might give you an idea of the ctypes involved. Ctypes is actually very easy to use, but if you don't understand the basic C concepts it will be challenging.