Je crée une application qui télécharge et installe ses propres plugins d'oeuf, mais j'ai un problème pour charger l'oeuf après easy_install l'extrait en place. Voici comment cela fonctionne maintenant:Comment installer easy_install egg plugin et le charger sans redémarrer l'application?
- App oeuf téléchargements dans le dossier temp
- Installe oeuf avec setuptools.command.easy_install.main() dans le dossier ~/.app/plugins (qui est pointé par un pième sur dist-packages)
- à ce stade, le dossier ~/.apps/plugins/facile install.pth est mis à jour avec le nouveau chemin d'oeuf
le problème est que le pième n'est pas rechargé jusqu'à ce que le processus de python est relancé, ce qui signifie que l'application doit être arrêtée et redémarrée (app est un processus de longue durée, et l'installation du plugin doit pas besoin d'un redémarrage). Donc, la question est comment, soit recharger le pth par programmation afin que la découverte du point d'entrée du plugin fonctionne pour le nouvel oeuf, ou en quelque sorte avoir easy_install retourner le chemin dans lequel il a installé l'oeuf, donc je peux manuellement (avec pkg_resources) charger le nouveau plugin?
Je pourrais créer une fonction qui essaye de deviner le chemin easy_install'ed ou analyser le pth par moi-même, mais je préfère ne pas le faire, si possible.
Python 2.6, setuptools 0.6c9
Merci à Marius Gedminas, ce que je fais maintenant est essentiellement:
dist = pkg_resources.get_distribution(plugin_name)
entry = dist.get_entry_info(entry_point_name, plugin_name)
plugin = entry.load()
Je ne connais pas grand-chose à setuptools, mais avez-vous essayé la fonction 'reload'? [docs] (http://docs.python.org/library/functions.html#reload) ou http://stackoverflow.com/questions/437589/how-do-i-unload-reload-a-python-module ? – cji
Oui je l'ai fait, mais recharger ne suffit pas. J'ai essayé de recharger le module de site (que je pense est responsable de lire pth) mais il n'a rien fait. Même site.addsitedir (os.path.expanduser ('~/.app/plugins')), qui semble ajouter le nouvel œuf dans la liste sys.path, n'est pas suffisant pour le rendre importable (import plugin_name) ou découvrable pour pkg_resources. – lkraider
zc.buildout fait quelque chose comme ça, même si je ne voudrais pas essayer de lire son code source. Avez-vous essayé de demander sur la liste de diffusion distutils-sig? –