2010-03-15 19 views
16

Uno rápido hoy: estoy aprendiendo las entradas y salidas de la biblioteca de distutils de Pythons, y me gustaría incluir un módulo de extensión de python (.pyd) con mi paquete. Sé por supuesto que la forma recomendada es tener distutils compilando la extensión en el momento en que se crea el paquete, pero esta es una extensión bastante compleja que abarca muchos archivos fuente y hace referencia a varias libretas externas, así que tomará bastante tiempo para que todo trabajando bien.Distribuya el módulo de extensión de python precompilado con distutils

Mientras tanto, tengo una compilación de trabajo conocida de la extensión que sale de Visual Studio, y me gustaría usarla en el instalador como una solución temporal que me permita enfocarme en otros problemas. Sin embargo, no puedo especificarlo como un módulo, ya que aparentemente deben tener una extensión .py explícita. ¿Cómo podría indicar en mi setup.py que quiero incluir un módulo de extensión precompilado?

(Python 3.1, si importa)

Respuesta

5

que resolvieron este reemplazando Extension.build_extension:

setup_args = { ... } 
if platform.system() == 'Windows': 
    class my_build_ext(build_ext): 
     def build_extension(self, ext): 
      ''' Copies the already-compiled pyd 
      ''' 
      import shutil 
      import os.path 
      try: 
       os.makedirs(os.path.dirname(self.get_ext_fullpath(ext.name))) 
      except WindowsError, e: 
       if e.winerror != 183: # already exists 
        raise 


      shutil.copyfile(os.path.join(this_dir, r'..\..\bin\Python%d%d\my.pyd' % sys.version_info[0:2]), self.get_ext_fullpath(ext.name)) 

    setup_args['cmdclass'] = {'build_ext': my_build_ext } 

setup(**setup_args) 
+0

¡Muy bonito! La respuesta también debería mencionar la entrada de extensión que entra en 'setup (..)': 'ext_modules = [Extension (" _ my_extension ", sources = [])]' – letmaik

Cuestiones relacionadas