import ctypes.util path = ctypes.util.find_library(name)
name
- имя библиотеки без какого-либо префикса.Функция find_library()
модуля ctypes
пытается найти библиотеку и вернуть ее путь.
Аргумент name
- это имя библиотеки без какого-либо префикса, такого как lib
, суффикса, такого как .so
, .dylib
, или номера версии. Это форма, используемая для опции компоновщика posix -l
.
Если библиотека не найдена, то функция find_library()
возвращает None. Точная функциональность зависит от системы.
При программировании на скомпилированном языке доступ к разделяемым библиотекам осуществляется при компиляции/компоновке программы и при ее запуске.
Цель функции ctypes.util.find_library()
- найти библиотеку способом, аналогичным тому, как это делает компилятор или загрузчик времени выполнения (на платформах с несколькими версиями разделяемой библиотеки должна быть загружена самая последняя версия), в то время как загрузчики модуля ctypes
действуют как при запуске программы и напрямую вызывают загрузчик времени выполнения.
В Linux функция ctypes.util.find_library()
пытается запустить внешние программы (/sbin/ ldconfig
, gcc
, objdump
и ld
), чтобы найти файл библиотеки. Она возвращает имя файла библиотеки.
Изменено в версии 3.6: в Linux значение переменной среды LD_LIBRARY_PATH
используется при поиске библиотек, если библиотека не может быть найдена другими способами.
>>> from ctypes.util import find_library >>> find_library("m") # 'libm.so.6' >>> find_library("c") # 'libc.so.6' >>> find_library("bz2") # 'libbz2.so.1.0' >>>
В OS X функция ctypes.util.find_library()
пытается найти библиотеку по нескольким предопределенным схемам именования и путям и в случае успеха возвращает полный путь.
>>> from ctypes.util import find_library >>> find_library("c") # '/usr/lib/libc.dylib' >>> find_library("m") # '/usr/lib/libm.dylib' >>> find_library("bz2") # '/usr/lib/libbz2.dylib' >>> find_library("AGL") # '/System/Library/Frameworks/AGL.framework/AGL' >>>
В Windows функция ctypes.util.find_library()
выполняет поиск по системному пути поиска и возвращает полное имя пути, но т.к. предопределенной схемы именования нет, то такой вызов, как ctypes.util.find_library('c')
, завершится ошибкой и вернет None
.
Если вы оборачиваете общую библиотеку с помощью модуля ctypes, то возможно, лучше определить имя общей библиотеки во время разработки и жестко закодировать ее имя в модуле-оболочке, а не использовать поиск find_library()
библиотеки во время выполнения.