summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Hupp <adam@hupp.org>2021-02-16 14:22:23 -0800
committerAdam Hupp <adam@hupp.org>2021-02-16 14:32:55 -0800
commitb520bf0bf6f815afad33878ecdbe4b1d907dcc94 (patch)
tree14be8b65d8b6b047d58f8d7e207302c1ecef2472
parent15b85a280cb267123d01ef61a672a0e38471e7be (diff)
downloadpython-magic-b520bf0bf6f815afad33878ecdbe4b1d907dcc94.tar.gz
Factor out dll loader so it can be used by both compat and standard library
https://github.com/ahupp/python-magic/issues/232
-rw-r--r--magic/__init__.py37
-rw-r--r--magic/compat.py10
-rw-r--r--magic/loader.py39
3 files changed, 43 insertions, 43 deletions
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