2010-07-12 5 views
6

Ich erstelle eine App, die ihre eigenen Ei-Plugins herunterlädt und installiert, aber ich habe ein Problem damit, das Ei zu laden, nachdem easy_install es an Ort und Stelle extrahiert hat. Dies ist, wie es funktioniert jetzt:Wie easy_install Ei-Plugin und laden Sie es ohne Neustart der Anwendung?

  • App-Downloads Ei in Tempfaltblatt
  • Installiert Ei mit setuptools.command.easy_install.main() in ~/.app/plugins Ordner (die auf von einem p-ten gerichtet ist dist-Pakete)
  • An dieser Stelle des ~/.apps/plugins/easy-install.pth wird mit dem neuen Ei Weg
aktualisiert

das Problem ist, dass die p-ten erst in dem python-Prozess neu geladen wird ist neu gestartet, was bedeutet, dass die App gestoppt und neu gestartet werden muss (App ist ein langwieriger Prozess und die Plugin-Installation muss) kein Neustart erforderlich). Die Frage ist, wie man die pth programmatisch neu lädt, so dass die plugin entry-point discovery für das neue Ei funktioniert, oder irgendwie easy_install gibt den Pfad zurück, in dem das Ei installiert wurde, damit ich es manuell (mit pkg_resources) machen kann. das neue Plugin laden?

Ich könnte eine Funktion erstellen, die versucht, den easy_install'ed Pfad zu erraten oder die Pth selbst zu analysieren, aber ich bevorzuge es nicht, wenn überhaupt möglich.

Python 2.6, Setuptools 0.6c9


Dank Marius Gedminas, was ich tue jetzt im Grunde ist:

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

Ich weiß nicht viel über setuptools, aber haben Sie versucht, 'reload' Funktion? [docs] (http://docs.python.org/library/functions.html#reload) oder http://stackoverflow.com/questions/437589/how-do-i-unload-reload-a-python-module ? – cji

+0

Ja, ich tat, aber das Nachladen ist nicht genug. Ich habe versucht, das Site-Modul neu zu laden (was ich denke, ist verantwortlich für das Lesen von Pth), aber es hat nichts getan. Sogar site.addsitedir (os.path.expanduser ('~/.app/plugins')), das das neue Ei in die sys.path-Liste zu fügen scheint, reicht nicht aus, um es importierbar (import plugin_name) oder erkennbar zu machen für pkg_resources. – lkraider

+0

zc.buildout macht so etwas, obwohl ich nicht versuchen möchte, seinen Quellcode zu lesen. Haben Sie versucht, auf der distutils-sig-Mailingliste zu fragen? –

Antwort

4

Nach einigen Browsen der documentation Ich denke , was Sie brauchen zu tun ist

pkg_resources.get_distribution(name).activate() 

Dabei ist Name der Name des gerade installierten Pakets.

+0

Wow, habe nicht bemerkt, dass es überall suchen würde, um eine Distribution zu finden, toll :) – lkraider

Verwandte Themen