Issue #11258: Speed up ctypes.util.find_library() under Linux a lot. Patch

by Jonas H.
This commit is contained in:
Antoine Pitrou 2011-02-26 08:45:20 +00:00
parent ec5a2d5e89
commit ffa1a77c67
4 changed files with 22 additions and 7 deletions

View File

@ -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()

View File

@ -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))

View File

@ -329,6 +329,7 @@ Dag Gruneau
Michael Guravage
Lars Gustäbel
Thomas Güttler
Jonas H.
Barry Haddow
Paul ten Hagen
Rasmus Hahn

View File

@ -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.