diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2011-02-26 08:45:20 +0000 |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2011-02-26 08:45:20 +0000 |
commit | ffa1a77c679b6d2480e3b0e27aa3736de93cda2d (patch) | |
tree | ef73a05e931ba04743759596ba7f90baf54ec56b | |
parent | ec5a2d5e89fbb2f3b4f1b68ece2735fd80985786 (diff) | |
download | cpython-git-ffa1a77c679b6d2480e3b0e27aa3736de93cda2d.tar.gz |
Issue #11258: Speed up ctypes.util.find_library() under Linux a lot. Patch
by Jonas H.
-rw-r--r-- | Lib/ctypes/test/test_loading.py | 7 | ||||
-rw-r--r-- | Lib/ctypes/util.py | 18 | ||||
-rw-r--r-- | Misc/ACKS | 1 | ||||
-rw-r--r-- | Misc/NEWS | 3 |
4 files changed, 22 insertions, 7 deletions
diff --git a/Lib/ctypes/test/test_loading.py b/Lib/ctypes/test/test_loading.py index 4029b463bc..c6815faaf6 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 1881e89688..3e8379f2f3 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)) @@ -329,6 +329,7 @@ Dag Gruneau Michael Guravage Lars Gustäbel Thomas Güttler +Jonas H. Barry Haddow Paul ten Hagen Rasmus Hahn @@ -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. |