2013-01-21 9 views
12

Il modulo distutils consente di includere e installare file di risorse insieme ai moduli Python. Come includerli correttamente se i file di risorse dovrebbero essere generati durante un processo di costruzione?Come eseguire passi personalizzati per la configurazione in setup.py?

Ad esempio, il progetto è un'applicazione Web che contiene sorgenti CoffeeScript che devono essere compilate in JavaScript e quindi incluse in un pacchetto Python. C'è un modo per integrare questo in un normale processo sdist/bdist?

risposta

1

Il modo migliore sarebbe scrivere un comando personalizzato build_coffeescript e renderlo un sottocomando di compilazione. Maggiori dettagli sono riportati nella altre risposte a domande simili/duplicati, ad esempio questo:

https://stackoverflow.com/a/1321345/150999

+3

http://stackoverflow.com/q/11331175/150999 http://stackoverflow.com/a/1321345/150999 – Sam

+0

In due anni ci dovrebbe essere abbastanza tempo per riformattare una risposta che è stato contrassegnato come risposta corretta. – erikbwork

+1

Sentiti libero di modificare la risposta. –

11

ho trascorso un bel po 'per capire questo fuori, i vari suggerimenti là fuori sono suddivisi in vari modi - si rompono installazione delle dipendenze, o non funzionano in pip, ecc Ecco la mia soluzione:

in setup.py:

from setuptools import setup, find_packages 
from setuptools.command.install import install 
from distutils.command.install import install as _install 

class install_(install): 
    # inject your own code into this func as you see fit 
    def run(self): 
     ret = None 
     if self.old_and_unmanageable or self.single_version_externally_managed: 
      ret = _install.run(self) 
     else: 
      caller = sys._getframe(2) 
      caller_module = caller.f_globals.get('__name__','') 
      caller_name = caller.f_code.co_name 

      if caller_module != 'distutils.dist' or caller_name!='run_commands': 
       _install.run(self) 
      else: 
       self.do_egg_install() 

     # This is just an example, a post-install hook 
     # It's a nice way to get at your installed module though 
     import site 
     site.addsitedir(self.install_lib) 
     sys.path.insert(0, self.install_lib) 
     from mymodule import install_hooks 
     install_hooks.post_install() 
     return ret 

Poi, nella chiamata alla funzione di configurazione, passare l'arg:

cmdclass={'install': install_} 

Si potrebbe utilizzare la stessa idea per costruire al contrario di installare, dare da soli un decoratore per rendere più facile, ecc Questo è stato testato tramite pip, e diretta 'python setup.py install' invocazione.

hth Un