From 9e759868e91b178bb12c8e4ee0afa6208423fe19 Mon Sep 17 00:00:00 2001 From: Francesco Biscani Date: Mon, 22 May 2017 14:53:30 +0200 Subject: [PATCH] Attempt porting to python 3. --- python/CMakeLists.txt | 56 +++++++++++++++++---------------- python/iiboost/__init__.py | 5 ++- python/iiboost/booster.py | 5 +-- python/src/iiboost_python.cpp | 2 +- python/tests/python_test_raw.py | 10 +++--- 5 files changed, 42 insertions(+), 36 deletions(-) diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index b4c1c2f..f21d66d 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -6,17 +6,17 @@ cmake_minimum_required (VERSION 2.8) # ###################################################################### -FIND_PACKAGE(PythonInterp 2 REQUIRED) - -IF(PYTHONINTERP_FOUND) - # check that Python version 2.x is used - execute_process(COMMAND ${PYTHON_EXECUTABLE} -c - "import sys; print(sys.version[0])" - OUTPUT_VARIABLE PYTHON_MAJOR_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE) - IF(NOT (${PYTHON_MAJOR_VERSION} EQUAL 2)) - MESSAGE(FATAL_ERROR "Python bindings require Python 2.x.") - ENDIF() -ENDIF() +FIND_PACKAGE(PythonInterp REQUIRED) + +#IF(PYTHONINTERP_FOUND) +# # check that Python version 2.x is used +# execute_process(COMMAND ${PYTHON_EXECUTABLE} -c +# "import sys; print(sys.version[0])" +# OUTPUT_VARIABLE PYTHON_MAJOR_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE) +# IF(NOT (${PYTHON_MAJOR_VERSION} EQUAL 2)) +# MESSAGE(FATAL_ERROR "Python bindings require Python 2.x.") +# ENDIF() +#ENDIF() ###################################################################### # @@ -24,21 +24,23 @@ ENDIF() # ###################################################################### -execute_process(COMMAND ${PYTHON_EXECUTABLE} -c - "import sys; print sys.exec_prefix" - OUTPUT_VARIABLE PYTHON_PREFIX OUTPUT_STRIP_TRAILING_WHITESPACE) +find_package(PythonLibs REQUIRED) -IF(APPLE AND ${PYTHON_PREFIX} MATCHES ".*framework.*") - SET(PYTHON_LIBRARIES "${PYTHON_PREFIX}/Python" - CACHE FILEPATH "Python libraries" - FORCE) -ELSE() - execute_process(COMMAND ${PYTHON_EXECUTABLE} -c - "import sys; skip = 2 if sys.platform.startswith('win') else 1; print 'python' + sys.version[0:3:skip]" - OUTPUT_VARIABLE PYTHON_LIBRARY_NAME OUTPUT_STRIP_TRAILING_WHITESPACE) - FIND_LIBRARY(PYTHON_LIBRARIES ${PYTHON_LIBRARY_NAME} HINTS "${PYTHON_PREFIX}" - PATH_SUFFIXES lib lib64 libs DOC "Python libraries") -ENDIF() +#execute_process(COMMAND ${PYTHON_EXECUTABLE} -c +# "import sys; print(sys.exec_prefix)" +# OUTPUT_VARIABLE PYTHON_PREFIX OUTPUT_STRIP_TRAILING_WHITESPACE) + +#IF(APPLE AND ${PYTHON_PREFIX} MATCHES ".*framework.*") +# SET(PYTHON_LIBRARIES "${PYTHON_PREFIX}/Python" +# CACHE FILEPATH "Python libraries" +# FORCE) +#ELSE() +# execute_process(COMMAND ${PYTHON_EXECUTABLE} -c +# "import sys; skip = 2 if sys.platform.startswith('win') else 1; print('python' + sys.version[0:3:skip])" +# OUTPUT_VARIABLE PYTHON_LIBRARY_NAME OUTPUT_STRIP_TRAILING_WHITESPACE) +# FIND_LIBRARY(PYTHON_LIBRARIES ${PYTHON_LIBRARY_NAME} HINTS "${PYTHON_PREFIX}" +# PATH_SUFFIXES lib lib64 libs DOC "Python libraries") +#ENDIF() ###################################################################### # @@ -47,7 +49,7 @@ ENDIF() ###################################################################### execute_process(COMMAND ${PYTHON_EXECUTABLE} -c - "from distutils.sysconfig import *; print get_python_inc()" + "from distutils.sysconfig import *; print(get_python_inc())" OUTPUT_VARIABLE PYTHON_INCLUDE OUTPUT_STRIP_TRAILING_WHITESPACE) SET(PYTHON_INCLUDE_PATH ${PYTHON_INCLUDE} CACHE PATH "Path to Python include files" @@ -61,7 +63,7 @@ SET(PYTHON_INCLUDE_PATH ${PYTHON_INCLUDE} ###################################################################### IF(NOT DEFINED IIBOOST_PYTHON_INSTALL_DIR OR IIBOOST_PYTHON_INSTALL_DIR MATCHES "^$") execute_process(COMMAND ${PYTHON_EXECUTABLE} -c - "from distutils.sysconfig import *; print get_python_lib(1)" + "from distutils.sysconfig import *; print(get_python_lib(1))" OUTPUT_VARIABLE PYTHON_SITE_PACKAGES OUTPUT_STRIP_TRAILING_WHITESPACE) FILE(TO_CMAKE_PATH ${PYTHON_SITE_PACKAGES} IIBOOST_PYTHON_INSTALL_DIR) ENDIF() diff --git a/python/iiboost/__init__.py b/python/iiboost/__init__.py index 21b2444..19e8b0c 100644 --- a/python/iiboost/__init__.py +++ b/python/iiboost/__init__.py @@ -1 +1,4 @@ -from booster import Booster, EigenVectorsOfHessianImage, computeEigenVectorsOfHessianImage, computeIntegralImage, ROICoordinates +# for python 2.0 compatibility +from __future__ import absolute_import as _ai + +from .booster import Booster, EigenVectorsOfHessianImage, computeEigenVectorsOfHessianImage, computeIntegralImage, ROICoordinates diff --git a/python/iiboost/booster.py b/python/iiboost/booster.py index 1a6e42a..3ea23a4 100644 --- a/python/iiboost/booster.py +++ b/python/iiboost/booster.py @@ -22,7 +22,8 @@ import numpy as np import ctypes -from exceptions import RuntimeError +if sys.version_info[0] < 3: + from exceptions import RuntimeError # libiiboost_python.so must reside in the same directory as this module. if sys.platform.startswith('win'): @@ -277,7 +278,7 @@ def trainWithChannels( self, imgStackList, eigVecOfHessianImgList, numStacks = len(chStackListList) numChannels = len(chStackListList[0]) - print "Number of stacks: ",numStacks,". Each with ",numChannels," channels." + print("Number of stacks: ",numStacks,". Each with ",numChannels," channels.") if debugOutput: dbgOut = ctypes.c_int(1) diff --git a/python/src/iiboost_python.cpp b/python/src/iiboost_python.cpp index 3cad0a8..301e35b 100644 --- a/python/src/iiboost_python.cpp +++ b/python/src/iiboost_python.cpp @@ -46,7 +46,7 @@ extern "C" std::string str; ((BoosterModel *)modelPtr)->serializeToString( &str ); - return PyString_FromString( str.c_str() ); + return PyBytes_FromString( str.c_str() ); } // create model from serialized string diff --git a/python/tests/python_test_raw.py b/python/tests/python_test_raw.py index 48e10d8..692bde9 100644 --- a/python/tests/python_test_raw.py +++ b/python/tests/python_test_raw.py @@ -20,19 +20,19 @@ def propToCArray( L, prop, cArrayElType ): # load data -print "--- Loading data ---" +print("--- Loading data ---") gts = [joblib.load("../../testData/gt.jlb")] imgs = [joblib.load("../../testData/img.jlb")] -print "--- Loading lib ---" +print("--- Loading lib ---") boostLib = ctypes.CDLL("../../build/python/libiiboost_python.so") # this returns a python string boostLib.serializeModel.restype = ctypes.py_object -print "--- Calling train() ---" +print("--- Calling train() ---") # we need to pass an array to the C call widthList = propToCArray( imgs, "shape[2]", ctypes.c_int) @@ -53,13 +53,13 @@ def propToCArray( L, prop, cArrayElType ): ctypes.c_int(numStumps), ctypes.c_int(debugOutput) ) ) -print "--- Serializing model ---" +print("--- Serializing model ---") serStr = ctypes.py_object( boostLib.serializeModel( model ) ) # pre-alloc prediction pred = np.empty_like( imgs[0], dtype=np.dtype("float32") ) -print "--- Predicting ---" +print("--- Predicting ---") boostLib.predict( model, ctypes.c_void_p(imgs[0].ctypes.data), widthList[0], heightList[0], depthList[0],