PCQRSCANER/venv/Lib/site-packages/pyzbar/zbar_library.py
2019-12-22 21:51:47 +01:00

70 lines
2.2 KiB
Python

"""Loads zbar and its dependencies.
"""
import platform
import sys
from ctypes import cdll
from ctypes.util import find_library
from pathlib import Path
__all__ = ['load']
def _windows_fnames():
"""For convenience during development and to aid debugging, the DLL names
are specific to the bit depth of interpreter.
This logic has its own function to make testing easier
"""
# 'libzbar-64.dll' and 'libzbar-32.dll' each have a dependent DLL -
# 'libiconv.dll' and 'libiconv-2.dll' respectively.
if sys.maxsize > 2**32:
# 64-bit
fname = 'libzbar-64.dll'
dependencies = ['libiconv.dll']
else:
# 32-bit
fname = 'libzbar-32.dll'
dependencies = ['libiconv-2.dll']
return fname, dependencies
def load():
"""Loads the libzar shared library and its dependencies.
"""
if 'Windows' == platform.system():
# Possible scenarios here
# 1. Run from source, DLLs are in pyzbar directory
# cdll.LoadLibrary() imports DLLs in repo root directory
# 2. Wheel install into CPython installation
# cdll.LoadLibrary() imports DLLs in package directory
# 3. Wheel install into virtualenv
# cdll.LoadLibrary() imports DLLs in package directory
# 4. Frozen
# cdll.LoadLibrary() imports DLLs alongside executable
fname, dependencies = _windows_fnames()
def load_objects(directory):
# Load dependencies before loading libzbar dll
deps = [
cdll.LoadLibrary(str(directory.joinpath(dep)))
for dep in dependencies
]
libzbar = cdll.LoadLibrary(str(directory.joinpath(fname)))
return deps, libzbar
try:
dependencies, libzbar = load_objects(Path(''))
except OSError:
dependencies, libzbar = load_objects(Path(__file__).parent)
else:
# Assume a shared library on the path
path = find_library('zbar')
if not path:
raise ImportError('Unable to find zbar shared library')
libzbar = cdll.LoadLibrary(path)
dependencies = []
return libzbar, dependencies