Source code for panoptes.utils.library
import ctypes
import ctypes.util
from astropy.utils import resolve_name
from loguru import logger
from panoptes.utils import error
[docs]def load_c_library(name, path=None, mode=ctypes.DEFAULT_MODE, **kwargs):
"""Utility function to load a shared/dynamically linked library (.so/.dylib/.dll).
The name and location of the shared library can be manually specified with the library_path
argument, otherwise the ctypes.util.find_library function will be used to try to locate based
on library_name.
Args:
name (str): name of the library (without 'lib' prefix or any suffixes, e.g. 'fli').
path (str, optional): path to the library e.g. '/usr/local/lib/libfli.so'.
mode (int, optional): mode in which to load the library, see dlopen(3) man page for
details. Should be one of ctypes.RTLD_GLOBAL, ctypes.RTLD_LOCAL, or
ctypes.DEFAULT_MODE. Default is ctypes.DEFAULT_MODE.
Returns:
ctypes.CDLL
Raises:
pocs.utils.error.NotFound: raised if library_path not given & find_library fails to
locate the library.
OSError: raises if the ctypes.CDLL loader cannot load the library.
"""
if mode is None:
# Interpret a value of None as the default.
mode = ctypes.DEFAULT_MODE
# Open library
logger.debug(f"Opening {name} library")
if not path:
path = ctypes.util.find_library(name)
if not path:
raise error.NotFound(f"Cound not find {name} library!")
# This CDLL loader will raise OSError if the library could not be loaded
return ctypes.CDLL(path, mode=mode)
[docs]def load_module(module_name):
"""Dynamically load a module.
>>> from panoptes.utils.library import load_module
>>> error = load_module('panoptes.utils.error')
>>> error.__name__
'panoptes.utils.error'
>>> error.__package__
'panoptes.utils'
Args:
module_name (str): Name of module to import.
Returns:
module: an imported module name
Raises:
error.NotFound: If module cannot be imported.
"""
try:
module = resolve_name(module_name)
except ImportError:
raise error.NotFound(msg=module_name)
return module