diff --git a/Lib/ctypes/test/test_loading.py b/Lib/ctypes/test/test_loading.py index 4029b463bcd..c6815faaf69 100644 --- a/Lib/ctypes/test/test_loading.py +++ b/Lib/ctypes/test/test_loading.py @@ -102,5 +102,12 @@ class LoaderTest(unittest.TestCase): # This is the real test: call the function via 'call_function' self.assertEqual(0, call_function(proc, (None,))) + if os.name != "nt": + def test_libc_exists(self): + # A basic test that the libc is found by find_library() + # XXX Can this fail on some non-Windows systems? + self.assertTrue(libc_name) + self.assertTrue(os.path.exists(libc_name)) + if __name__ == "__main__": unittest.main() diff --git a/Lib/ctypes/util.py b/Lib/ctypes/util.py index 1881e896888..3e8379f2f34 100644 --- a/Lib/ctypes/util.py +++ b/Lib/ctypes/util.py @@ -203,14 +203,18 @@ elif os.name == "posix": abi_type = mach_map.get(machine, 'libc6') # XXX assuming GLIBC's ldconfig (with option -p) - expr = r'(\S+)\s+\((%s(?:, OS ABI:[^\)]*)?)\)[^/]*(/[^\(\)\s]*lib%s\.[^\(\)\s]*)' \ - % (abi_type, re.escape(name)) + name = 'lib%s' % name + pat = re.compile('\s*(/[^\(\)\s]*%s\.[^\(\)\s]*)' % re.escape(name)) with contextlib.closing(os.popen('LC_ALL=C LANG=C /sbin/ldconfig -p 2>/dev/null')) as f: - data = f.read() - res = re.search(expr, data) - if not res: - return None - return res.group(1) + for line in f: + if not '=>' in line: + continue + path = line.rsplit('=>', 1)[1] + if not name+'.' in path: + continue + res = pat.search(path) + if res: + return res.group(1) def find_library(name): return _findSoname_ldconfig(name) or _get_soname(_findLib_gcc(name)) diff --git a/Misc/ACKS b/Misc/ACKS index 8066ebcc16b..20e9b0bd68b 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -329,6 +329,7 @@ Dag Gruneau Michael Guravage Lars Gustäbel Thomas Güttler +Jonas H. Barry Haddow Paul ten Hagen Rasmus Hahn diff --git a/Misc/NEWS b/Misc/NEWS index 30fa398ab9e..3d0abee2dde 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -35,6 +35,9 @@ Core and Builtins Library ------- +- Issue #11258: Speed up ctypes.util.find_library() under Linux a lot. Patch + by Jonas H. + - Issue #11297: Add collections.ChainMap(). - Issue #10755: Add the posix.fdlistdir() function. Patch by Ross Lagerwall.