Currently, the pip._internal.utils.glibc_version_string() function is implemented with ctypes to access gnu_get_libc_version() function. But os.confstr('CS_GNU_LIBC_VERSION') could be used instead to avoid ctypes.
I recently modified platform.libc_ver() on Python stdlib to use os.confstr('CS_GNU_LIBC_VERSION') is available:
The best would be if pip could avoid completely ctypes, but I'm not sure if it's possible. In the past, I reported issues times to times when pip broke when ctypes was not available, but it seems to be a lost battle: pip or pip dependencies commonly use ctypes. Instead, on the Python upstream CI, we now try to ensure that ctypes is always available on buildbots.
If you want to test a Python without ctypes, inject this code before using pip: