mirror of
https://github.com/opencv/opencv.git
synced 2024-12-05 01:39:13 +08:00
130 lines
4.1 KiB
Python
130 lines
4.1 KiB
Python
'''
|
|
OpenCV Python binary extension loader
|
|
'''
|
|
import os
|
|
import sys
|
|
|
|
__all__ = []
|
|
|
|
try:
|
|
import numpy
|
|
import numpy.core.multiarray
|
|
except ImportError:
|
|
print('OpenCV bindings requires "numpy" package.')
|
|
print('Install it via command:')
|
|
print(' pip install numpy')
|
|
raise
|
|
|
|
|
|
py_code_loader = None
|
|
if sys.version_info[:2] >= (3, 0):
|
|
try:
|
|
from . import _extra_py_code as py_code_loader
|
|
except:
|
|
pass
|
|
|
|
# TODO
|
|
# is_x64 = sys.maxsize > 2**32
|
|
|
|
def bootstrap():
|
|
import sys
|
|
|
|
import copy
|
|
save_sys_path = copy.copy(sys.path)
|
|
|
|
if hasattr(sys, 'OpenCV_LOADER'):
|
|
print(sys.path)
|
|
raise ImportError('ERROR: recursion is detected during loading of "cv2" binary extensions. Check OpenCV installation.')
|
|
sys.OpenCV_LOADER = True
|
|
|
|
DEBUG = False
|
|
if hasattr(sys, 'OpenCV_LOADER_DEBUG'):
|
|
DEBUG = True
|
|
|
|
import platform
|
|
if DEBUG: print('OpenCV loader: os.name="{}" platform.system()="{}"'.format(os.name, str(platform.system())))
|
|
|
|
LOADER_DIR = os.path.dirname(os.path.abspath(os.path.realpath(__file__)))
|
|
|
|
PYTHON_EXTENSIONS_PATHS = []
|
|
BINARIES_PATHS = []
|
|
|
|
g_vars = globals()
|
|
l_vars = locals()
|
|
|
|
if sys.version_info[:2] < (3, 0):
|
|
from . load_config_py2 import exec_file_wrapper
|
|
else:
|
|
from . load_config_py3 import exec_file_wrapper
|
|
|
|
def load_first_config(fnames, required=True):
|
|
for fname in fnames:
|
|
fpath = os.path.join(LOADER_DIR, fname)
|
|
if not os.path.exists(fpath):
|
|
if DEBUG: print('OpenCV loader: config not found, skip: {}'.format(fpath))
|
|
continue
|
|
if DEBUG: print('OpenCV loader: loading config: {}'.format(fpath))
|
|
exec_file_wrapper(fpath, g_vars, l_vars)
|
|
return True
|
|
if required:
|
|
raise ImportError('OpenCV loader: missing configuration file: {}. Check OpenCV installation.'.format(fnames))
|
|
|
|
load_first_config(['config.py'], True)
|
|
load_first_config([
|
|
'config-{}.{}.py'.format(sys.version_info[0], sys.version_info[1]),
|
|
'config-{}.py'.format(sys.version_info[0])
|
|
], True)
|
|
|
|
if DEBUG: print('OpenCV loader: PYTHON_EXTENSIONS_PATHS={}'.format(str(l_vars['PYTHON_EXTENSIONS_PATHS'])))
|
|
if DEBUG: print('OpenCV loader: BINARIES_PATHS={}'.format(str(l_vars['BINARIES_PATHS'])))
|
|
|
|
applySysPathWorkaround = False
|
|
if hasattr(sys, 'OpenCV_REPLACE_SYS_PATH_0'):
|
|
applySysPathWorkaround = True
|
|
else:
|
|
try:
|
|
BASE_DIR = os.path.dirname(LOADER_DIR)
|
|
if sys.path[0] == BASE_DIR or os.path.realpath(sys.path[0]) == BASE_DIR:
|
|
applySysPathWorkaround = True
|
|
except:
|
|
if DEBUG: print('OpenCV loader: exception during checking workaround for sys.path[0]')
|
|
pass # applySysPathWorkaround is False
|
|
|
|
for p in reversed(l_vars['PYTHON_EXTENSIONS_PATHS']):
|
|
sys.path.insert(1 if not applySysPathWorkaround else 0, p)
|
|
|
|
if os.name == 'nt':
|
|
if sys.version_info[:2] >= (3, 8): # https://github.com/python/cpython/pull/12302
|
|
for p in l_vars['BINARIES_PATHS']:
|
|
try:
|
|
os.add_dll_directory(p)
|
|
except Exception as e:
|
|
if DEBUG: print('Failed os.add_dll_directory(): '+ str(e))
|
|
pass
|
|
os.environ['PATH'] = ';'.join(l_vars['BINARIES_PATHS']) + ';' + os.environ.get('PATH', '')
|
|
if DEBUG: print('OpenCV loader: PATH={}'.format(str(os.environ['PATH'])))
|
|
else:
|
|
# amending of LD_LIBRARY_PATH works for sub-processes only
|
|
os.environ['LD_LIBRARY_PATH'] = ':'.join(l_vars['BINARIES_PATHS']) + ':' + os.environ.get('LD_LIBRARY_PATH', '')
|
|
|
|
if DEBUG: print('OpenCV loader: replacing cv2 module')
|
|
del sys.modules['cv2']
|
|
import cv2
|
|
|
|
sys.path = save_sys_path # multiprocessing should start from bootstrap code (https://github.com/opencv/opencv/issues/18502)
|
|
|
|
try:
|
|
import sys
|
|
del sys.OpenCV_LOADER
|
|
except:
|
|
pass
|
|
|
|
if DEBUG: print('OpenCV loader: binary extension... OK')
|
|
|
|
if py_code_loader:
|
|
py_code_loader.init('cv2')
|
|
|
|
if DEBUG: print('OpenCV loader: DONE')
|
|
|
|
bootstrap()
|