2010-07-12 5 views
6

Sto creando un'app che scarica e installa i propri plugin egg, ma ho un problema nel caricare l'egg dopo che easy_install lo ha estratto. Questo è come funziona la società:Come installare facilmente il plug-in egg e caricarlo senza riavviare l'applicazione?

  • App uovo download nella cartella Temp
  • Installa uovo con setuptools.command.easy_install.main() in ~/.app/plugins cartella (che è indicato da un pth su dist-packages)
  • a questo punto, il ~/.apps/plugins/easy-install.pth viene aggiornato con il nuovo percorso uovo

il problema è che il PTH non è ricaricato fino a quando il processo di pitone viene riavviato, il che significa che l'app deve essere arrestata e riavviata (l'app è un processo di lunga durata e l'installazione del plugin deve non richiede un riavvio).

Quindi la domanda è come, o ricaricare il p del programma in modo che la scoperta del punto di ingresso del plugin funzioni per il nuovo uovo, o in qualche modo avere easy_install restituisca il percorso in cui ha installato l'uovo, così posso manualmente (con pkg_resources) caricare il nuovo plugin?

Potrei creare una funzione che tenta di indovinare il percorso easy_install'ed o analizzare il pth da solo, ma preferisco non farlo, se possibile.

Python 2.6, setuptools 0.6c9


Grazie a Marius Gedminas, quello che sto facendo ora è fondamentalmente:

dist = pkg_resources.get_distribution(plugin_name) 
entry = dist.get_entry_info(entry_point_name, plugin_name) 
plugin = entry.load() 
+0

Non so molto su setuptools, ma hai provato la funzione di 'ricarica '? [docs] (http://docs.python.org/library/functions.html#reload) o http://stackoverflow.com/questions/437589/how-do-i-unload-reload-a-python-module ? – cji

+0

Sì, ma ricaricare non è abbastanza. Ho provato a ricaricare il modulo del sito (che penso sia responsabile della lettura di pth) ma non ha fatto nulla. Anche site.addsitedir (os.path.expanduser ('~/.app/plugins')), che sembra aggiungere il nuovo egg nell'elenco sys.path, non è sufficiente per renderlo importable (import plugin_name) o rilevabile per pkg_resources. – lkraider

+0

zc.buildout fa qualcosa del genere, anche se non vorrei provare a leggere il suo codice sorgente. Hai provato a chiedere sulla mailing list distutils-sig? –

risposta

4

Dopo un po 'la navigazione del documentation io penso quello che ti serve da fare è

pkg_resources.get_distribution(name).activate() 

dove nome è il nome del pacchetto che hai appena installato.

+0

Wow, non ho notato che avrebbe cercato ovunque per trovare una distribuzione, ottimo :) – lkraider

Problemi correlati