mirror of https://github.com/opencv/opencv.git
Configures and loads OpenCV bindings extension including 3rdparty dependencies Based on running Python specify: - configure PYTHON_PATH (via "sys.path") - configure LD_LIBRARY_PATH / PATHpull/12977/head
parent
e5afa62c3d
commit
ce6acd3ecd
13 changed files with 301 additions and 27 deletions
@ -0,0 +1,4 @@ |
||||
__pycache__ |
||||
*.pyc |
||||
*.egg-info |
||||
*dist |
@ -0,0 +1,89 @@ |
||||
''' |
||||
OpenCV Python binary extension loader |
||||
''' |
||||
import os |
||||
import sys |
||||
|
||||
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 |
||||
|
||||
# TODO |
||||
# is_x64 = sys.maxsize > 2**32 |
||||
|
||||
def bootstrap(): |
||||
import sys |
||||
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(__file__)) |
||||
|
||||
PYTHON_EXTENSIONS_PATHS = [] |
||||
BINARIES_PATHS = [] |
||||
|
||||
g_vars = globals() |
||||
l_vars = locals() |
||||
|
||||
if sys.version_info[:2] < (3, 0): |
||||
from cv2.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']))) |
||||
|
||||
for p in reversed(l_vars['PYTHON_EXTENSIONS_PATHS']): |
||||
sys.path.insert(0, p) |
||||
|
||||
if os.name == 'nt': |
||||
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 |
||||
|
||||
try: |
||||
import sys |
||||
del sys.OpenCV_LOADER |
||||
except: |
||||
pass |
||||
|
||||
if DEBUG: print('OpenCV loader: DONE') |
||||
|
||||
bootstrap() |
@ -0,0 +1,6 @@ |
||||
# flake8: noqa |
||||
import sys |
||||
|
||||
if sys.version_info[:2] < (3, 0): |
||||
def exec_file_wrapper(fpath, g_vars, l_vars): |
||||
execfile(fpath, g_vars, l_vars) |
@ -0,0 +1,9 @@ |
||||
# flake8: noqa |
||||
import os |
||||
import sys |
||||
|
||||
if sys.version_info[:2] >= (3, 0): |
||||
def exec_file_wrapper(fpath, g_vars, l_vars): |
||||
with open(fpath) as f: |
||||
code = compile(f.read(), os.path.basename(fpath), 'exec') |
||||
exec(code, g_vars, l_vars) |
@ -0,0 +1,57 @@ |
||||
import os |
||||
import sys |
||||
import platform |
||||
import setuptools |
||||
|
||||
SCRIPT_DIR=os.path.dirname(os.path.abspath(__file__)) |
||||
|
||||
def main(): |
||||
os.chdir(SCRIPT_DIR) |
||||
|
||||
package_name = 'opencv' |
||||
package_version = os.environ.get('OPENCV_VERSION', '3.4.4') # TODO |
||||
|
||||
long_description = 'Open Source Computer Vision Library Python bindings' # TODO |
||||
|
||||
setuptools.setup( |
||||
name=package_name, |
||||
version=package_version, |
||||
url='https://github.com/opencv/opencv', |
||||
license='BSD', |
||||
description='OpenCV python bindings', |
||||
long_description=long_description, |
||||
long_description_content_type="text/markdown", |
||||
packages=setuptools.find_packages(), |
||||
maintainer="OpenCV Team", |
||||
install_requires="numpy", |
||||
classifiers=[ |
||||
'Development Status :: 5 - Production/Stable', |
||||
'Environment :: Console', |
||||
'Intended Audience :: Developers', |
||||
'Intended Audience :: Education', |
||||
'Intended Audience :: Information Technology', |
||||
'Intended Audience :: Science/Research', |
||||
'License :: BSD License', |
||||
'Operating System :: MacOS', |
||||
'Operating System :: Microsoft :: Windows', |
||||
'Operating System :: POSIX', |
||||
'Operating System :: Unix', |
||||
'Programming Language :: Python', |
||||
'Programming Language :: Python :: 2', |
||||
'Programming Language :: Python :: 2.7', |
||||
'Programming Language :: Python :: 3', |
||||
'Programming Language :: Python :: 3.4', |
||||
'Programming Language :: Python :: 3.5', |
||||
'Programming Language :: Python :: 3.6', |
||||
'Programming Language :: Python :: 3.7', |
||||
'Programming Language :: C++', |
||||
'Programming Language :: Python :: Implementation :: CPython', |
||||
'Topic :: Scientific/Engineering', |
||||
'Topic :: Scientific/Engineering :: Image Recognition', |
||||
'Topic :: Software Development', |
||||
'Topic :: Software Development :: Libraries', |
||||
], |
||||
) |
||||
|
||||
if __name__ == '__main__': |
||||
main() |
@ -0,0 +1,3 @@ |
||||
PYTHON_EXTENSIONS_PATHS = [ |
||||
@CMAKE_PYTHON_EXTENSION_PATH@ |
||||
] + PYTHON_EXTENSIONS_PATHS |
@ -0,0 +1,3 @@ |
||||
BINARIES_PATHS = [ |
||||
@CMAKE_PYTHON_BINARIES_PATH@ |
||||
] + BINARIES_PATHS |
@ -0,0 +1,54 @@ |
||||
ocv_assert(NOT OPENCV_SKIP_PYTHON_LOADER) |
||||
|
||||
set(PYTHON_SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}") |
||||
|
||||
ocv_assert(DEFINED OPENCV_PYTHON_INSTALL_PATH) |
||||
if(OpenCV_FOUND) |
||||
set(__loader_path "${OpenCV_BINARY_DIR}/python_loader") |
||||
else() |
||||
set(__loader_path "${CMAKE_BINARY_DIR}/python_loader") |
||||
endif() |
||||
|
||||
set(__python_loader_install_tmp_path "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/install/python_loader/") |
||||
if(IS_ABSOLUTE "${OPENCV_PYTHON_INSTALL_PATH}") |
||||
set(OpenCV_PYTHON_INSTALL_PATH_RELATIVE_CONFIGCMAKE "${CMAKE_INSTALL_PREFIX}/") |
||||
set(CMAKE_PYTHON_EXTENSION_INSTALL_PATH_BASE "'${CMAKE_INSTALL_PREFIX}'") |
||||
else() |
||||
file(RELATIVE_PATH OpenCV_PYTHON_INSTALL_PATH_RELATIVE_CONFIGCMAKE "${CMAKE_INSTALL_PREFIX}/${OPENCV_PYTHON_INSTALL_PATH}/cv2" ${CMAKE_INSTALL_PREFIX}) |
||||
set(CMAKE_PYTHON_EXTENSION_INSTALL_PATH_BASE "os.path.join(LOADER_DIR, '${OpenCV_PYTHON_INSTALL_PATH_RELATIVE_CONFIGCMAKE}')") |
||||
endif() |
||||
|
||||
set(PYTHON_LOADER_FILES |
||||
"setup.py" "cv2/__init__.py" |
||||
"cv2/load_config_py2.py" "cv2/load_config_py3.py" |
||||
) |
||||
foreach(fname ${PYTHON_LOADER_FILES}) |
||||
get_filename_component(__dir "${fname}" DIRECTORY) |
||||
file(COPY "${PYTHON_SOURCE_DIR}/package/${fname}" DESTINATION "${__loader_path}/${__dir}") |
||||
install(FILES "${PYTHON_SOURCE_DIR}/package/${fname}" DESTINATION "${OPENCV_PYTHON_INSTALL_PATH}/${__dir}" COMPONENT python) |
||||
endforeach() |
||||
|
||||
if(NOT OpenCV_FOUND) # Ignore "standalone" builds of Python bindings |
||||
if(WIN32) |
||||
if(CMAKE_GENERATOR MATCHES "Visual Studio") |
||||
list(APPEND CMAKE_PYTHON_BINARIES_PATH "'${EXECUTABLE_OUTPUT_PATH}/Release'") # TODO: CMAKE_BUILD_TYPE is not defined |
||||
else() |
||||
list(APPEND CMAKE_PYTHON_BINARIES_PATH "'${EXECUTABLE_OUTPUT_PATH}'") |
||||
endif() |
||||
else() |
||||
list(APPEND CMAKE_PYTHON_BINARIES_PATH "'${LIBRARY_OUTPUT_PATH}'") |
||||
endif() |
||||
string(REPLACE ";" ",\n " CMAKE_PYTHON_BINARIES_PATH "${CMAKE_PYTHON_BINARIES_PATH}") |
||||
configure_file("${PYTHON_SOURCE_DIR}/package/template/config.py.in" "${__loader_path}/cv2/config.py" @ONLY) |
||||
|
||||
if(WIN32) |
||||
list(APPEND CMAKE_PYTHON_BINARIES_INSTALL_PATH "os.path.join(${CMAKE_PYTHON_EXTENSION_INSTALL_PATH_BASE}, '${OPENCV_BIN_INSTALL_PATH}')") |
||||
else() |
||||
list(APPEND CMAKE_PYTHON_BINARIES_INSTALL_PATH "os.path.join(${CMAKE_PYTHON_EXTENSION_INSTALL_PATH_BASE}, '${OPENCV_LIB_INSTALL_PATH}')") |
||||
endif() |
||||
string(REPLACE ";" ",\n " CMAKE_PYTHON_BINARIES_PATH "${CMAKE_PYTHON_BINARIES_INSTALL_PATH}") |
||||
configure_file("${PYTHON_SOURCE_DIR}/package/template/config.py.in" "${__python_loader_install_tmp_path}/cv2/config.py" @ONLY) |
||||
install(FILES "${__python_loader_install_tmp_path}/cv2/config.py" DESTINATION "${OPENCV_PYTHON_INSTALL_PATH}/cv2/" COMPONENT python) |
||||
|
||||
message(STATUS "OpenCV Python: during development append to PYTHONPATH: ${__loader_path}") |
||||
endif() |
Loading…
Reference in new issue