From b520bf0bf6f815afad33878ecdbe4b1d907dcc94 Mon Sep 17 00:00:00 2001 From: Adam Hupp Date: Tue, 16 Feb 2021 14:22:23 -0800 Subject: Factor out dll loader so it can be used by both compat and standard library https://github.com/ahupp/python-magic/issues/232 --- magic/__init__.py | 37 ++----------------------------------- magic/compat.py | 10 ++-------- magic/loader.py | 39 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 43 deletions(-) create mode 100644 magic/loader.py diff --git a/magic/__init__.py b/magic/__init__.py index f2fd34d..7a75b75 100644 --- a/magic/__init__.py +++ b/magic/__init__.py @@ -206,41 +206,8 @@ def from_descriptor(fd, mime=False): m = _get_magic_type(mime) return m.from_descriptor(fd) - -libmagic = None -# Let's try to find magic or magic1 -dll = ctypes.util.find_library('magic') \ - or ctypes.util.find_library('magic1') \ - or ctypes.util.find_library('cygmagic-1') \ - or ctypes.util.find_library('libmagic-1') \ - or ctypes.util.find_library('msys-magic-1') # for MSYS2 - -# necessary because find_library returns None if it doesn't find the library -if dll: - libmagic = ctypes.CDLL(dll) - -if not libmagic or not libmagic._name: - windows_dlls = ['magic1.dll', 'cygmagic-1.dll', 'libmagic-1.dll', 'msys-magic-1.dll'] - platform_to_lib = {'darwin': ['/opt/local/lib/libmagic.dylib', - '/usr/local/lib/libmagic.dylib'] + - # Assumes there will only be one version installed - glob.glob('/usr/local/Cellar/libmagic/*/lib/libmagic.dylib'), # flake8:noqa - 'win32': windows_dlls, - 'cygwin': windows_dlls, - 'linux': ['libmagic.so.1'], - # fallback for some Linuxes (e.g. Alpine) where library search does not work # flake8:noqa - } - platform = 'linux' if sys.platform.startswith('linux') else sys.platform - for dll in platform_to_lib.get(platform, []): - try: - libmagic = ctypes.CDLL(dll) - break - except OSError: - pass - -if not libmagic or not libmagic._name: - # It is better to raise an ImportError since we are importing magic module - raise ImportError('failed to find libmagic. Check your installation') +from . import loader +libmagic = loader.load_lib() magic_t = ctypes.c_void_p diff --git a/magic/compat.py b/magic/compat.py index 7b39691..e2d71ee 100644 --- a/magic/compat.py +++ b/magic/compat.py @@ -12,16 +12,10 @@ from ctypes import * from ctypes.util import find_library -def _init(): - """ - Loads the shared library through ctypes and returns a library - L{ctypes.CDLL} instance - """ - return ctypes.cdll.LoadLibrary(find_library('magic')) - +from . import loader _libraries = {} -_libraries['magic'] = _init() +_libraries['magic'] = loader.load_lib() # Flag constants for open and setflags MAGIC_NONE = NONE = 0 diff --git a/magic/loader.py b/magic/loader.py new file mode 100644 index 0000000..6a47d52 --- /dev/null +++ b/magic/loader.py @@ -0,0 +1,39 @@ +import ctypes +import sys + +def load_lib(): + libmagic = None + # Let's try to find magic or magic1 + dll = ctypes.util.find_library('magic') \ + or ctypes.util.find_library('magic1') \ + or ctypes.util.find_library('cygmagic-1') \ + or ctypes.util.find_library('libmagic-1') \ + or ctypes.util.find_library('msys-magic-1') # for MSYS2 + + # necessary because find_library returns None if it doesn't find the library + if dll: + libmagic = ctypes.CDLL(dll) + + if not libmagic or not libmagic._name: + windows_dlls = ['magic1.dll', 'cygmagic-1.dll', 'libmagic-1.dll', 'msys-magic-1.dll'] + platform_to_lib = {'darwin': ['/opt/local/lib/libmagic.dylib', + '/usr/local/lib/libmagic.dylib'] + + # Assumes there will only be one version installed + glob.glob('/usr/local/Cellar/libmagic/*/lib/libmagic.dylib'), # flake8:noqa + 'win32': windows_dlls, + 'cygwin': windows_dlls, + 'linux': ['libmagic.so.1'], + # fallback for some Linuxes (e.g. Alpine) where library search does not work # flake8:noqa + } + platform = 'linux' if sys.platform.startswith('linux') else sys.platform + for dll in platform_to_lib.get(platform, []): + try: + libmagic = ctypes.CDLL(dll) + break + except OSError: + pass + + if not libmagic or not libmagic._name: + # It is better to raise an ImportError since we are importing magic module + raise ImportError('failed to find libmagic. Check your installation') + return libmagic \ No newline at end of file -- cgit v1.2.1