Usando distutils donde el archivo de interfaz swig está en la carpeta src

Tengo un setup.py que se parece a esto:

from setuptools import setup, Extension import glob sources = glob.glob('src/*.cpp') + glob.glob('src/*.i') # this is ugly, but otherwise I get the wrapper included twice sources = [source for source in sources if '_wrap' not in source] setup( name = 'engine', ext_modules = [ Extension( '_engine', sources = sources, swig_opts = ['-c++'], include_dirs = ['src'] ) ], py_modules = ['engine'] package_dir = {'' : 'src'} ) 

Ahora esto funciona mientras ejecuto la install dos veces. La primera vez, swig crea engine.py en el directorio src. Pero no se copia al objective. La segunda vez que ejecuto el archivo setup.py, el engine.py se encuentra y se instala. ¿Hay alguna manera de hacer que todo funcione la primera vez?

Estoy de acuerdo en que esto debería funcionar fuera de la caja, y lo consideraría un error.

Una opción para hacer que esto funcione es simplemente cambiar el orden en que se construyen las cosas. Por defecto, setup.py primero recostackrá los módulos de Python, luego construirá cualquier paquete externo.

Puede cambiar el orden de comstackción setup.py una setup.py a la clase de build predeterminada, y luego pedir a setup.py que use su clase de build personalizada a través de la opción cmdclass .

 from setuptools import setup, Extension from distutils.command.build import build as _build #Define custom build order, so that the python interface module #created by SWIG is staged in build_py. class build(_build): # different order: build_ext *before* build_py sub_commands = [('build_ext', _build.has_ext_modules), ('build_py', _build.has_pure_modules), ('build_clib', _build.has_c_libraries), ('build_scripts', _build.has_scripts), ] setup( name = 'engine', cmdclass = {'build': build }, #Use your own build class ext_modules = [Extension('_engine', sources = sources, swig_opts = ['-c++'], include_dirs = ['src'] )], ...