title: Using Python setuptools to put Cython-compiled pyd files in their original folders?
body: <p>I'm trying to build the setup.py package for my Python 3.4 app which contains a Cython module. My plan is to have a setup.py file which requires Cython and compiles the .pyx file with the idea that typically I would just run that on Win32 (x86 &amp; x64) and Mac and then generate platform wheels and upload them to PyPI, so regular users wouldn't need Cython or to compile anything.</p>
  
  <p>Currently I can get the setup.py script to build the .pyd file, but it doesn't put the built .pyd file in the same location as the original .pyx file which is where I need it to be.</p>
  
  <p>I tried manually copying the .pyd file, but then when I generate the wheel via bdist_wheel I get a pure Python wheel which I think is wrong since there are different version of my built .pyx file depending on the platform. I also tried subclassing the <code>Distribution</code> class and forcing <code>is_pure()</code> to return False (as described <a href="http://lucumr.pocoo.org/2014/1/27/python-on-wheels/" rel="noreferrer">here in the Building Wheels section</a>), but that doesn't work. (Still generates a pure Python wheel.)</p>
  
  <p>I assume that if I can get the setup.py script to put the compiled file in the right location, then the wheel will not be pure Python and everything will be fine.</p>
  
  <p>So my questions are:</p>
  
  <ol>
  <li>Is there some kind of setting in setup.py to tell it to put the compiled Cython files into the same locations as the source files?</li>
  <li>Or is there a way to copy the compiled files to the location I need them but for the wheel to still be built as non-pure?</li>
  <li>Or am I going about this in the wrong way. Should I change my Python code to pull the compiled packages from somewhere else? (That doesn't seem right to me.)</li>
  <li>[EDIT] Or should I put the compiled binary .pyd / .so / .dylib into the package, add logic to get the right .pyd based on architecture at runtime, and then have a pure Python wheel? (That also doesn't seem right to me.)</li>
  </ol>
  
  <p>More information on my setup:
  I'm using setuptools (not distutils) in my setup.py script. A snippet of my setup.py is here (with a lot of stuff removed to keep it to the stuff that's relevant):</p>
  
  <pre><code>from setuptools import setup, Extension
  from Cython.Build import cythonize
  from Cython.Distutils import build_ext
  
  ...
  
  extensions = [
      Extension(name='audio_interface',
                sources=['mpf/mc/core/audio/audio_interface.pyx'],
                include_dirs=include_dirs,
                library_dirs=library_dirs,
                libraries=libraries,
                extra_objects=extra_objects,
                extra_compile_args=extra_compile_args,
                extra_link_args=extra_link_args),
  
  ...
  
  setup(
        ...
        ext_modules=cythonize(extensions),
        cmdclass= {'build_ext': build_ext},
        ...
  </code></pre>
  
  <p>Thanks!
  Brian</p>