Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to easy_install egg plugin and load it without restarting application?

I'm creating an app that downloads and installs its own egg plugins, but I have a problem loading the egg after easy_install extracts it into place. This is how it works now:

  • App downloads egg into temp folder
  • Installs egg with setuptools.command.easy_install.main() into ~/.app/plugins folder (which is pointed by a pth on dist-packages)
  • At this point, the ~/.apps/plugins/easy-install.pth is updated with the new egg path

The problem is that the pth is not reloaded until the python process is relaunched, which means the app has to be stopped and restarted (app is a long-running process, and plugin installation must not require a restart).

So the question is how to, either reload the pth programatically so that plugin entry-point discovery works for the new egg, or somehow have easy_install return the path it installed the egg into, so I can manually (with pkg_resources) load the new plugin?

I could create a function that tries to guess the easy_install'ed path or parse the pth on my own, but I prefer not to, if at all possible.

Python 2.6, setuptools 0.6c9


Thanks to Marius Gedminas, what I'm doing now basically is:

dist = pkg_resources.get_distribution(plugin_name)
entry = dist.get_entry_info(entry_point_name, plugin_name)
plugin = entry.load()
like image 701
lkraider Avatar asked Jul 12 '10 18:07

lkraider


1 Answers

After some browsing of the documentation I think what you need to do is

pkg_resources.get_distribution(name).activate()

where name is the name of the package you just installed.

like image 180
Marius Gedminas Avatar answered Nov 17 '22 06:11

Marius Gedminas