]> granicus.if.org Git - python/commitdiff
Issue #21042: Return full path in ctypes.util.find_library() on Linux
authorMartin Panter <vadmium+py@gmail.com>
Thu, 10 Mar 2016 01:06:23 +0000 (01:06 +0000)
committerMartin Panter <vadmium+py@gmail.com>
Thu, 10 Mar 2016 01:06:23 +0000 (01:06 +0000)
Patch by Tamás Bence Gedai.

Doc/library/ctypes.rst
Lib/ctypes/test/test_find.py
Lib/ctypes/util.py
Misc/ACKS
Misc/NEWS

index 3b0c9562dd46dcbccf33efed01929dd0689c5f9d..58e1ea3ac05f5007ef10b30956b53fc65526ec07 100644 (file)
@@ -1252,15 +1252,15 @@ The exact functionality is system dependent.
 
 On Linux, :func:`find_library` tries to run external programs
 (``/sbin/ldconfig``, ``gcc``, and ``objdump``) to find the library file.  It
-returns the filename of the library file.  Here are some examples::
+returns the absolute path of the library file.  Here are some examples::
 
    >>> from ctypes.util import find_library
    >>> find_library("m")
-   'libm.so.6'
+   '/lib/x86_64-linux-gnu/libm.so.6'
    >>> find_library("c")
-   'libc.so.6'
+   '/lib/x86_64-linux-gnu/libc.so.6'
    >>> find_library("bz2")
-   'libbz2.so.1.0'
+   '/lib/x86_64-linux-gnu/libbz2.so.1.0'
    >>>
 
 On OS X, :func:`find_library` tries several predefined naming schemes and paths
@@ -1829,6 +1829,9 @@ Utility functions
 
    The exact functionality is system dependent.
 
+   .. versionchanged:: 3.6
+      On Linux it returns an absolute path.
+
 
 .. function:: find_msvcrt()
    :module: ctypes.util
index e6bc19d7dddf98c64abca05656edaace4bf0cb0e..1845bb0e723bdf7577a6cb59fe7e322c8bb9bb85 100644 (file)
@@ -9,39 +9,39 @@ from ctypes.util import find_library
 class Test_OpenGL_libs(unittest.TestCase):
     @classmethod
     def setUpClass(cls):
-        lib_gl = lib_glu = lib_gle = None
+        cls.lib_gl = cls.lib_glu = cls.lib_gle = None
         if sys.platform == "win32":
-            lib_gl = find_library("OpenGL32")
-            lib_glu = find_library("Glu32")
+            cls.lib_gl = find_library("OpenGL32")
+            cls.lib_glu = find_library("Glu32")
         elif sys.platform == "darwin":
-            lib_gl = lib_glu = find_library("OpenGL")
+            cls.lib_gl = cls.lib_glu = find_library("OpenGL")
         else:
-            lib_gl = find_library("GL")
-            lib_glu = find_library("GLU")
-            lib_gle = find_library("gle")
+            cls.lib_gl = find_library("GL")
+            cls.lib_glu = find_library("GLU")
+            cls.lib_gle = find_library("gle")
 
         ## print, for debugging
         if test.support.verbose:
             print("OpenGL libraries:")
-            for item in (("GL", lib_gl),
-                         ("GLU", lib_glu),
-                         ("gle", lib_gle)):
+            for item in (("GL", cls.lib_gl),
+                         ("GLU", cls.lib_glu),
+                         ("gle", cls.lib_gle)):
                 print("\t", item)
 
         cls.gl = cls.glu = cls.gle = None
-        if lib_gl:
+        if cls.lib_gl:
             try:
-                cls.gl = CDLL(lib_gl, mode=RTLD_GLOBAL)
+                cls.gl = CDLL(cls.lib_gl, mode=RTLD_GLOBAL)
             except OSError:
                 pass
-        if lib_glu:
+        if cls.lib_glu:
             try:
-                cls.glu = CDLL(lib_glu, RTLD_GLOBAL)
+                cls.glu = CDLL(cls.lib_glu, RTLD_GLOBAL)
             except OSError:
                 pass
-        if lib_gle:
+        if cls.lib_gle:
             try:
-                cls.gle = CDLL(lib_gle)
+                cls.gle = CDLL(cls.lib_gle)
             except OSError:
                 pass
 
@@ -64,6 +64,14 @@ class Test_OpenGL_libs(unittest.TestCase):
             self.skipTest('lib_gle not available')
         self.gle.gleGetJoinStyle
 
+    def test_abspath(self):
+        if self.lib_gl:
+            self.assertTrue(os.path.isabs(self.lib_gl))
+        if self.lib_glu:
+            self.assertTrue(os.path.isabs(self.lib_glu))
+        if self.lib_gle:
+            self.assertTrue(os.path.isabs(self.lib_gle))
+
 # On platforms where the default shared library suffix is '.so',
 # at least some libraries can be loaded as attributes of the cdll
 # object, since ctypes now tries loading the lib again
index 9e74ccdbcf40d720957c82188aa2c338876eee64..d8e3bfac9e39cc07ad851d59400fad4ec2143106 100644 (file)
@@ -221,8 +221,8 @@ elif os.name == "posix":
             abi_type = mach_map.get(machine, 'libc6')
 
             # XXX assuming GLIBC's ldconfig (with option -p)
-            regex = os.fsencode(
-                '\s+(lib%s\.[^\s]+)\s+\(%s' % (re.escape(name), abi_type))
+            regex = r'lib%s\.[^\s]+\s\(%s(?:,\s.*)?\)\s=>\s(.*)'
+            regex = os.fsencode(regex % (re.escape(name), abi_type))
             try:
                 with subprocess.Popen(['/sbin/ldconfig', '-p'],
                                       stdin=subprocess.DEVNULL,
index 6d8fcf8571647a94e9fcf69378577510e926721b..0a67f39d2dd240467172e5b4612d0c1864f8d105 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -487,6 +487,7 @@ Matthieu Gautier
 Stephen M. Gava
 Xavier de Gaye
 Harry Henry Gebel
+Tamás Bence Gedai
 Marius Gedminas
 Jan-Philip Gehrcke
 Thomas Gellekum
index 205891b902ba0fcb6f71d96e89cd8ab0d8893cda..d678a6986db07723c669c4d4c40bcb7366947221 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -201,6 +201,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #21042: Make ctypes.util.find_library() return the full path on
+  Linux, similar to other platforms.  Patch by Tamás Bence Gedai.
+
 - Issue #15068: Got rid of excessive buffering in fileinput.
   The bufsize parameter is now deprecated and ignored.