Getting PyTables to Play Nice with Windows¶
I originally started this as a wiki page on my fork of ViTables. After trying to understand why ViTables would crash on some Windows boxes but not others, I found out that it had nothing to do with ViTables. So, I’ll just put it here. These are primarily the notes I wrote while digging into the problem.
tl;dr: Your Python installation on Windows is stupid and needs to be reinstalled.
Running Notes¶
So, apparently something screwy is going on with Python on Windows. Everything seems to work just dandy fine on other systems. Digging around, it appears that the problem is isolated _exclusively_ in the Anaconda distribution of Python. More to the point, the PyTables packaging within the Anaconda distribution. A quick check is to run:
$ python3 -c 'import tables; tables.test()'
and see if it works. Cygwin is just plain happy to run the tests using the native Python in Cygwin. Only one error related to the type of error raised by one method. WinPython runs to the end and doesn’t even complain once.
Using Anaconda, it runs for about 2.5 lines, but then it pops up a
window saying “python.exe has stopped working.” Opening up a debug
instance (after fighting with the community version of Visual Studio
2015) shows a trace to netdll.dll
through hdf5extension.pyd
.
Searching the site-package tree reveals the offending file is in the
tables
package. file
tells me the .pyd
file is a DLL for
Windows, but nm
and objdump
don’t give me any useful
information. I assume it should be linking to the HDF5 libraries
because PyTables is a simple extension of the HDF5 file. grep
ing
around, I find:
$ find Lib -name 'hdf5*' | grep -v '__pycache__'
...
Lib/site-packages/tables/hdfExtension.py
Lib/site-packages/tables/hdfextension.pyd
$ find libs -name 'hdf5*' | grep -v '__pycache__'
$ find Library -name 'hdf5*' | grep -v '__pycache__'
Library/bin/hdf5.dll
Library/bin/hdf5_cpp.dll
Library/bin/hdf5_hl.dll
...
Library/lib/hdf5.lib
Library/lib/hdf5_cpp.lib
...
So, the libraries are there, but the runtime cannot find them. Taking a look at the WinPython distribution we find:
$ find Lib -name 'hdf5*' | grep -v '__pycache__'
...
Lib/site-packages/tables/hdf5.dll
Lib/site-packages/tables/hdfExtension.py
Lib/site-packages/tables/hdfextension.pyd
Lib/site-packages/tables/hdf5_hl.dll
$ find libs -name 'hdf5*' | grep -v '__pycache__'
and no Library directory. The key point is the DLLs are next to the files. This is making no sense to me.
Rooting around the internet some more, I come across the search order
for DLLs.
Checking my PATH
variable, I see that indeed
/c/path/to/anaconda/Library/bin
is not on my path. Thus, the
current directory approach of WinPython works out of the box. Trying to
add this to the path didn’t help on the outset
And if I go to a computer that has Anaconda installed that I know still
works, the DLLS are installed in the Lib/site-packages/tables
directory! (I hate Windows sometimes). I tried reinstalling Anaconda
using the 2.3.0 version available at the time of writing. That didn’t
help.
A (Hacked) Solution¶
It appears like we have to do things the hard way if we want to use Anaconda. First, uninstall PyTables from Anaconda:
$ conda uninstall pytables
Now, we need to us pip
:
$ pip install tables
Odds are, this will spew out a long and confusing string of error messages. If you see something referring to “MSC V.1600 64 bit (AMD64)” and “Microsoft Visual C++ 10.0 is required,” it means you will need to hunt down the proper version of the version of Visual Studio. In this case, you want Visual Studio 2010. Sadly, that does not appear to be a viable option. I can get the professional version installed from my IT department, but I was not able to find a legitimate link from Microsoft. I’m sure I could dig up a link from a non-Microsoft source, but that would not be a good idea in my opinion.
A (Real) Solution¶
A real solution is to just install a version of Python that stashes the
DLLs somewhere in the modules can find. Most likely, this will be one
that installs the libraries into the site-package/tables
directory
just like WinPython does.