2010-03-15 2 views
16

Uno veloce oggi: sto imparando gli ingressi e gli estratti della libreria Pythons distutils e vorrei includere un modulo di estensione python (.pyd) con il mio pacchetto. So che il modo consigliato è di avere le distutils compilare l'estensione al momento della creazione del pacchetto, ma questa è un'estensione piuttosto complessa che copre molti file sorgente e fa riferimento a diverse librerie esterne, quindi ci vorrà del gioco significativo per ottenere tutto funziona beneDistribuire il modulo di estensione python precompilato con le distutils

Nel frattempo ho una build funzionante nota dell'estensione che esce da Visual Studio e vorrei utilizzarla nell'installer come soluzione temporanea per permettermi di concentrarmi su altri problemi. Non posso tuttavia specificarlo come modulo, dal momento che quelli apparentemente devono avere un'estensione .py esplicita. Come potrei indicare nel mio setup.py che voglio includere un modulo di estensione precompilato?

(Python 3.1, se è importante)

risposta

5

Ho risolto questo sovrascrivendo 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

Molto bello! La risposta dovrebbe anche menzionare la voce di estensione che va in 'setup (..)': 'ext_modules = [Extension (" _ my_extension ", sources = [])]' – letmaik