Wednesday, April 11, 2012

Installing a working Cython on Windows with MinGW: a comic tragedy

The following is the contents of a text file I have written to myself and will keep on-hand for the next time I have to install Cython:



Setting up Cython:
1. Works with 32-bit Python for some reason.  (I discovered why but forgot.)
2. Install 32-bit Python
3. Install 32-bit MinGW
3. Install setuptools for Win32
4. Write a batch file with the necessary paths, like containing:

*********
SET PATH=C:\MinGW\bin;C:\MinGW\MSYS\1.0\local\bin;C:\MinGW\MSYS\1.0\bin;C:\Python27_32;C:\Python27_32\Scripts
start cmd
*********

5. IN C:\(pythonpath)\Lib\distutils, create distutils.cfg, containing the text:

*********
[build]
compiler = mingw32
*********

6. In cygwinccompiler.py in the same directory, remove all instances of "-mno-cygwin".  This refers to a command line switch that has been removed in more recent versions of Cygwin/MinGW.

7. Run this to set up a command prompt window with the appropriate paths, then run: easy_install cython

8. Write a setup.py for the source modules to compile.  The modules should have the extension .pyx (instead of .py).  It should look something like:

**********
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

ext_modules = [Extension("hello", ["hello.pyx"])]
// ext_modules can contain as many Extension entries as there are
//   modules to compile.  Change the module name and filename to
//   match each module to compile, of course.

// In the following, change name to something appropriate.
setup(
  name = 'Hello world app',
  cmdclass = {'build_ext': build_ext},
  ext_modules = ext_modules
)
**********

9. Run from the pathed command window:
python setup.py build_ext --inplace

The module should now be importable.  It should work, at least.

The tragic/comic part of it all is the week it took me to get all this working. I actually did it all for the 64-bit version of Cython and almost got it working, only to be stopped by (yet another) mysterious error, only this one didn't have a solution. There's still one or two steps I ran into doing that that I haven't run into with the 32-bit version yet -- I'll probably run into those once I actually bring Cython to In Profundis' code (currently I've only compiled Hello World with it).

2 comments:

  1. Well, I’ve now wasted many hours trying to install Cython into my python27 distribution on MS Vista. The MinGW linker throws “cannot find -lmsvcr90” error at the end of the install process. I did remove all instances of the command line argument “-mno-cygwin” from the cygwinccompiler.py file as per the instructions. A web search indicated that I needed to install the Microsoft Visual C++ 2008 Redistributable Package:

    http://www.microsoft.com/en-us/download/details.aspx?id=29

    So I did. Still no joy. Fortunately, I just program as a hobby. Still, it’s frustrating – I was looking forward to futzing about with Cython.

    PS: One good thing did come out of it, I now have easy_install in my python installation. It’s a lot handier than using setup. Thanks for your blog post.

    ReplyDelete
  2. The Cython wiki now has a page about compiling 64-bit python extensions in windows: https://github.com/cython/cython/wiki/64BitCythonExtensionsOnWindows

    Apparently, they recommend against trying to use mingw64 and instead provide a link to Microsoft Windows SDK for Windows 7 and .NET Framework 4.

    ReplyDelete