PyFLANN for python3: ModuleNotFoundError: No module named ‘index’
I have installed the pyFLANN library for Python 3.6.5 using:
pip install pyflann Collecting pyflann Downloading https://files.pythonhosted.org/packages/d9/03/87c9a4c18506176635c10b901ed55eee9a2bcf560756704719590479f1f2/pyflann-1.6.14.tar.gz (7.1MB) 100% |████████████████████████████████| 7.1MB 152kB/s Building wheels for collected packages: pyflann Running setup.py bdist_wheel for pyflann ... done Stored in directory: C:\Users\azam_\AppData\Local\pip\Cache\wheels\5b\77\d6\39a95cf44089e47d1896f23c8fa927737525d51e033d4bdc6c Successfully built pyflann Installing collected packages: pyflann Successfully installed pyflann-1.6.14
after installing, when I was trying to run a sample code given on their GitHub page:
from pyflann import * import numpy as np dataset = np.array( [[1., 1, 1, 2, 3], [10, 10, 10, 3, 2], [100, 100, 2, 30, 1] ]) testset = np.array( [[1., 1, 1, 1, 1], [90, 90, 10, 10, 1] ]) flann = FLANN() result, dists = flann.nn( dataset, testset, 2, algorithm="kmeans", branching=32, iterations=7, checks=16) print result print dists dataset = np.random.rand(10000, 128) testset = np.random.rand(1000, 128) flann = FLANN() result, dists = flann.nn( dataset, testset, 5, algorithm="kmeans", branching=32, iterations=7, checks=16) print result print dists
I was getting the following error:
$ python pyflann_test.py File "pyflann_test.py", line 16 print result ^ SyntaxError: Missing parentheses in call to 'print'. Did you mean print(result)?
after adding brackets to print statement, the updated code:
from pyflann import * import numpy as np dataset = np.array( [[1., 1, 1, 2, 3], [10, 10, 10, 3, 2], [100, 100, 2, 30, 1] ]) testset = np.array( [[1., 1, 1, 1, 1], [90, 90, 10, 10, 1] ]) flann = FLANN() result, dists = flann.nn( dataset, testset, 2, algorithm="kmeans", branching=32, iterations=7, checks=16) print (result) print (dists) dataset = np.random.rand(10000, 128) testset = np.random.rand(1000, 128) flann = FLANN() result, dists = flann.nn( dataset, testset, 5, algorithm="kmeans", branching=32, iterations=7, checks=16) print (result) print (dists)
executing it again produces:
$ python pyflann_test.py Traceback (most recent call last): File "pyflann_test.py", line 1, in <module> from pyflann import * File "C:\Users\azam_\Envs\py3\lib\site-packages\pyflann\__init__.py", line 27, in <module> from index import * ModuleNotFoundError: No module named 'index'
The pyflann is actually compiled for python 2, so need to change some syntax errors in different files of installed pyflann directory in dist-packages of python3.
This site mentions almost all of the mistakes.
But the fastest method to convert pyflann to python3 compatible is using the following ($ sudo 2to3 -w <path to pyflann in python dist-packages> )command:
$ sudo 2to3 -w /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann [sudo] password for azam: root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt RefactoringTool: Skipping optional fixer: buffer root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt RefactoringTool: Skipping optional fixer: idioms root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt RefactoringTool: Skipping optional fixer: set_literal root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt RefactoringTool: Skipping optional fixer: ws_comma root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt RefactoringTool: Refactored /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/__init__.py --- /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/__init__.py (original) +++ /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/__init__.py (refactored) @@ -24,9 +24,9 @@ #(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF #THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -from index import * -from io.dataset import load, save +from .index import * +from .io.dataset import load, save try: - from io.hdf5_dataset import load_range + from .io.hdf5_dataset import load_range except: pass RefactoringTool: Refactored /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/index.py --- /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/index.py (original) +++ /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/index.py (refactored) @@ -24,8 +24,8 @@ #(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF #THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -from bindings.flann_ctypes import * -from io.dataset import * +from .bindings.flann_ctypes import * +from .io.dataset import * import numpy.random as _rn RefactoringTool: Refactored /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/bindings/__init__.py --- /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/bindings/__init__.py (original) +++ /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/bindings/__init__.py (refactored) @@ -27,4 +27,4 @@ #from pyflann import * #from pyflann_parameters import parameter_list, algorithm_names #from pyflann_parameters import centers_init_names, log_level_names -from flann_ctypes import * +from .flann_ctypes import * RefactoringTool: Refactored /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/bindings/flann_ctypes.py --- /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/bindings/flann_ctypes.py (original) +++ /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/bindings/flann_ctypes.py (refactored) @@ -50,7 +50,7 @@ self.update(self._defaults_) def update(self, dict): - for k, v in dict.iteritems(): + for k, v in dict.items(): if k in self.__field_names: setattr(self, k, self.__translate(k, v)) @@ -75,7 +75,7 @@ def __translate_back(self, k, v): if k in self._translation_: - for tk, tv in self._translation_[k].iteritems(): + for tk, tv in self._translation_[k].items(): if tv == v: return tk return v @@ -148,7 +148,7 @@ try: flannlib = cdll[os.path.join(root_dir, libdir, libname)] return flannlib - except Exception, e: + except Exception as e: pass tmp = os.path.dirname(root_dir) if tmp == root_dir: @@ -198,7 +198,7 @@ def define_functions(str): for type in type_mappings: - exec str % {'C': type[0], 'numpy': type[1]} + exec(str % {'C': type[0], 'numpy': type[1]}) flann.build_index = {} define_functions(r""" RefactoringTool: Refactored /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/io/__init__.py --- /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/io/__init__.py (original) +++ /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/io/__init__.py (refactored) @@ -24,4 +24,4 @@ #(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF #THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -from dataset import * +from .dataset import * RefactoringTool: Refactored /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/io/binary_dataset.py --- /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/io/binary_dataset.py (original) +++ /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/io/binary_dataset.py (refactored) @@ -24,7 +24,7 @@ #(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF #THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -from __future__ import with_statement + from pyflann.exceptions import FLANNException import numpy root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt root: Generating grammar tables from /usr/lib/python2.7/lib2to3/PatternGrammar.txt RefactoringTool: Refactored /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/io/dat_dataset.py --- /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/io/dat_dataset.py (original) +++ /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/io/dat_dataset.py (refactored) @@ -24,7 +24,7 @@ #(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF #THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -from __future__ import with_statement + from pyflann.exceptions import FLANNException import numpy RefactoringTool: Refactored /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/io/dataset.py --- /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/io/dataset.py (original) +++ /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/io/dataset.py (refactored) @@ -24,13 +24,13 @@ #(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF #THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -from __future__ import with_statement + from pyflann.exceptions import FLANNException -import binary_dataset -import dat_dataset -import npy_dataset -import hdf5_dataset +from . import binary_dataset +from . import dat_dataset +from . import npy_dataset +from . import hdf5_dataset import os.path from numpy import float32 @@ -45,7 +45,7 @@ def load(filename, rows = -1, cols = -1, dtype = float32, **kwargs): - for format in dataset_formats.values(): + for format in list(dataset_formats.values()): if format.check(filename): return format.load(filename, rows, cols, dtype, **kwargs) raise FLANNException("Error: Unknown dataset format") @@ -58,5 +58,5 @@ format = extension[1:] handler = dataset_formats[format] handler.save(dataset, filename, **kwargs) - except Exception,e: + except Exception as e: raise FLANNException(e) RefactoringTool: Refactored /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/io/hdf5_dataset.py --- /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/io/hdf5_dataset.py (original) +++ /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/io/hdf5_dataset.py (refactored) @@ -24,14 +24,14 @@ #(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF #THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -from __future__ import with_statement + from pyflann.exceptions import FLANNException import numpy have_h5py = True try: import h5py -except Exception,e: +except Exception as e: have_h5py = False if not have_h5py: @@ -64,7 +64,7 @@ h5file = h5py.File(filename) h5file.create_dataset(dataset_name, data=dataset) h5file.close() - except Exception,e: + except Exception as e: h5file.close() raise FLANNException(e) @@ -77,12 +77,12 @@ else: dataset_name = 'dataset' - for node in h5file.keys(): + for node in list(h5file.keys()): if node == dataset_name: data = numpy.array(h5file[node]) h5file.close() return data - except Exception,e: + except Exception as e: h5file.close() raise FLANNException(e) RefactoringTool: Refactored /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/io/npy_dataset.py --- /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/io/npy_dataset.py (original) +++ /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/io/npy_dataset.py (refactored) @@ -24,7 +24,7 @@ #(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF #THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -from __future__ import with_statement + from pyflann.exceptions import FLANNException import numpy RefactoringTool: Refactored /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/util/weave_tools.py --- /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/util/weave_tools.py (original) +++ /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/util/weave_tools.py (refactored) @@ -121,7 +121,7 @@ defaults = [] if defaults==None else defaults if len(args) != len(defaults): raise Exception("The %s function must have default values for all arguments"%name) - arg_tuples = zip(args,defaults) + list(varargs) + arg_tuples = list(zip(args,defaults)) + list(varargs) self.add_function(name,code,*arg_tuples) return func return decorate @@ -138,7 +138,7 @@ defaults = [] if defaults==None else defaults if len(args) != len(defaults): raise Exception("The %s function must have default values for all arguments"%name) - vardict = dict(zip(args,defaults)) + vardict = dict(list(zip(args,defaults))) self.extension.add_function(ext_tools.ext_function(name, code, args, local_dict = vardict)) return func @@ -165,7 +165,7 @@ format = join([ s for (s,_,_) in members],'') self.__struct_dict = dict( (v for (_,v,_) in members) ) self.__translation_dict = dict( ( (k[0],v) for (_,k,v) in members if v != None)) - print self.__translation_dict + print(self.__translation_dict) self.__struct = struct.Struct(format) RefactoringTool: Files that were modified: RefactoringTool: /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/__init__.py RefactoringTool: /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/index.py RefactoringTool: /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/bindings/__init__.py RefactoringTool: /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/bindings/flann_ctypes.py RefactoringTool: /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/io/__init__.py RefactoringTool: /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/io/binary_dataset.py RefactoringTool: /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/io/dat_dataset.py RefactoringTool: /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/io/dataset.py RefactoringTool: /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/io/hdf5_dataset.py RefactoringTool: /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/io/npy_dataset.py RefactoringTool: /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/util/weave_tools.py RefactoringTool: Warnings/messages while refactoring: RefactoringTool: ### In file /home/azam/.virtualenvs/keras_py/lib/python3.5/site-packages/pyflann/io/binary_dataset.py ### RefactoringTool: Line 65: could not convert: raise "No .meta file present, you must specify dataset rows, cols asd dtype" RefactoringTool: Python 3 does not support string exceptions
after all, this executing the same file produces the expected results:
$ python pyflann_test.py [[0 1] [2 1]] [[5.000e+00 2.480e+02] [6.640e+02 1.285e+04]] [[3248 4024 4805 2569 5944] [2576 832 3174 8231 2910] [7631 8281 3689 8853 9344] ... [2195 6304 7359 4336 5607] [7553 2281 6094 9804 6834] [3443 7222 1290 9268 2465]] [[15.12251162 15.17127961 16.2346509 16.46582042 16.89452732] [15.23944829 16.09247273 16.46303628 17.54092922 17.72544804] [16.82947424 17.77703272 17.86748326 18.48309253 19.26260551] ... [14.15228159 15.37001149 16.15817762 16.20372887 16.20940254] [14.36123099 14.66829362 15.51947857 16.54545765 16.79084565] [14.84465391 15.87923275 16.22655922 16.41113724 16.4808538 ]]