Amazingly, this seems to work:
r = glReadPixels(0,0,screen_size[0],screen_size[1],   GL_RED, GL_UNSIGNED_BYTE)
g = glReadPixels(0,0,screen_size[0],screen_size[1], GL_GREEN, GL_UNSIGNED_BYTE)
b = glReadPixels(0,0,screen_size[0],screen_size[1],  GL_BLUE, GL_UNSIGNED_BYTE)
image = pygame.Surface(screen_size)
for y in range(screen_size[1]):
    for x in range(screen_size[0]):
        image.set_at((x,screen_size[1]-y-1),(r[y][x],g[y][x],b[y][x]))
pygame.image.save(image,"screenshot.png")

Ian