Issue #11258: Speed up ctypes.util.find_library() under Linux by a factor

of 5 to 10.  Initial patch by Jonas H.
This commit is contained in:
Antoine Pitrou 2011-04-23 17:51:04 +02:00
parent 877509aef4
commit 8c52027e2d
3 changed files with 18 additions and 8 deletions

View file

@ -1,5 +1,6 @@
import sys, os import sys, os
import contextlib import contextlib
import subprocess
# find_library(name) returns the pathname of a library, or None. # find_library(name) returns the pathname of a library, or None.
if os.name == "nt": if os.name == "nt":
@ -203,14 +204,19 @@ elif os.name == "posix":
abi_type = mach_map.get(machine, 'libc6') abi_type = mach_map.get(machine, 'libc6')
# XXX assuming GLIBC's ldconfig (with option -p) # XXX assuming GLIBC's ldconfig (with option -p)
expr = r'(\S+)\s+\((%s(?:, OS ABI:[^\)]*)?)\)[^/]*(/[^\(\)\s]*lib%s\.[^\(\)\s]*)' \ regex = os.fsencode(
% (abi_type, re.escape(name)) '\s+(lib%s\.[^\s]+)\s+\(%s' % (re.escape(name), abi_type))
with contextlib.closing(os.popen('LC_ALL=C LANG=C /sbin/ldconfig -p 2>/dev/null')) as f: try:
data = f.read() with subprocess.Popen(['/sbin/ldconfig', '-p'],
res = re.search(expr, data) stdin=subprocess.DEVNULL,
if not res: stderr=subprocess.DEVNULL,
return None stdout=subprocess.PIPE,
return res.group(1) env={'LC_ALL': 'C', 'LANG': 'C'}) as p:
res = re.search(regex, p.stdout.read())
if res:
return os.fsdecode(res.group(1))
except OSError:
pass
def find_library(name): def find_library(name):
return _findSoname_ldconfig(name) or _get_soname(_findLib_gcc(name)) return _findSoname_ldconfig(name) or _get_soname(_findLib_gcc(name))

View file

@ -338,6 +338,7 @@ Filip Gruszczyński
Michael Guravage Michael Guravage
Lars Gustäbel Lars Gustäbel
Thomas Güttler Thomas Güttler
Jonas H.
Barry Haddow Barry Haddow
Paul ten Hagen Paul ten Hagen
Rasmus Hahn Rasmus Hahn

View file

@ -113,6 +113,9 @@ Core and Builtins
Library Library
------- -------
- Issue #11258: Speed up ctypes.util.find_library() under Linux by a factor
of 5 to 10. Initial patch by Jonas H.
- Issue #11382: Trivial system calls, such as dup() or pipe(), needn't - Issue #11382: Trivial system calls, such as dup() or pipe(), needn't
release the GIL. Patch by Charles-François Natali. release the GIL. Patch by Charles-François Natali.