From: Christoph G. <cg...@uc...> - 2012-08-27 17:22:18
|
On 8/27/2012 9:42 AM, Antonio Valentino wrote: > Hi Stuart, > > Il 27/08/2012 17:43, Stuart Mentzer ha scritto: >> Hello, >> >> I upgraded to PyTables 2.4.0 and I was "freezing" an application on Windows with PyInstaller. The frozen app fails at this new find_library call in __init__.py: >> >> if not ctypes.util.find_library('hdf5dll.dll'): >> raise ImportError('Could not load "hdf5dll.dll", please ensure' + >> ' that it can be found in the system path') >> >> PyInstaller correctly places this DLL in the same directory as the application .exe where standard Windows DLL search logic will find it. Apparently the find_library doesn't do that in a frozen application. That is a big problem. I had to comment this code out to get a working frozen app. >> >> That code was added in revision e9f6919. >> > > It is mainly a sanity check added under request of one of our users: > https://github.com/PyTables/PyTables/pull/146 > > >> This is on Windows 7 64-bit with a 32-bit Python toolchain. Trying both PyInstaller 1.5.1 and 2.0. >> >> Should I file a bug report? Any easy work-around? >> >> Thanks, >> Stuart >> > > Yes please file a pull request with your patch. > It would be nice to preserve the sanity check in standard case so, > maybe, a good solution could be adding some check on sys.frozen or > something like that. > > Thank you > Hello, As a workaround for frozen distributions, try to add the sys.executable directory to os.environ['PATH'] before importing tables. Ctypes only tries to find a library in the os.environ['PATH'] directories, not the current directory or the sys.executable directory as one could expect. http://hg.python.org/cpython/file/64640a02b0ca/Lib/ctypes/util.py#l48 As a workaround, for distributions that place the HDF5 and other DLLs in the tables package directory, tables.__init__.py adds the tables package directory to os.environ['PATH']. This also makes sure that the DLLs are found when loading the hdf5Extension.pyd and other C extension modules (another common problem). The use of __file__ to get the tables directory should better be wrapped in a try..except statement. https://github.com/PyTables/PyTables/blob/develop/tables/__init__.py#L24 Christoph |