2010-07-12 45 views
6

我正在创建一个应用程序,用于下载并安装它自己的egg插件,但在easy_install将它提取到位后,我有一个加载egg的问题。这是它是如何工作现在:如何easy_install egg插件并在不重新启动应用程序的情况下加载它?

  • 应用软件下载鸡蛋打入temp文件夹
  • 安装鸡蛋setuptools.command.easy_install.main()到〜/。应用程序/ plugins文件夹中(这是由PTH上指出DIST-包)
  • 在这一点上,在〜/ .apps /插件/易install.pth与新蛋路径

的问题是,PTH不重新加载,直到蟒蛇进程更新重新启动,这意味着应用程序必须停止并重新启动(应用程序是一个长期运行的过程,并且插件安装必须不需要重启)。

所以问题是如何以编程方式重新加载pth使插件入口点发现适用于新的鸡蛋,或者以某种方式让easy_install返回它安装鸡蛋的路径,所以我可以手动(使用pkg_resources)加载新的插件?

我可以创建一个函数来尝试猜测easy_install'ed的路径或者自己解析pth,但是如果可能的话,我宁愿不要。

的Python 2.6,setuptools的0.6c9


感谢Marius Gedminas,我现在正在做的主要是:

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

我对setuptools了解不多,但是你有没有尝试过'reload'函数? [docs](http://docs.python.org/library/functions.html#reload)或http://stackoverflow.com/questions/437589/how-do-i-unload-reload-a-python-module ? – cji 2010-07-12 18:41:20

+0

是的,但是重新加载是不够的。我尝试重新加载站点模块(我认为它负责阅读pth),但它什么也没做。 即使site.addsitedir(os.path.expanduser('〜/ .app/plugins')),它似乎将新egg添加到sys.path列表中,但不足以使其可导入(import plugin_name)或可发现为pkg_resources。 – lkraider 2010-07-12 19:33:08

+0

zc.buildout做了这样的事情,虽然我不想尝试阅读它的源代码。 你有没有试过在distutils-sig邮件列表上提问? – 2010-07-14 18:13:56

回答

4

documentation的一些浏览我认为你需要什么之后要做的是

pkg_resources.get_distribution(name).activate() 

其中name是您刚刚安装的软件包的名称。

+0

哇,没有注意到它会搜索到处找到一个分布,很棒:) – lkraider 2010-07-15 17:20:15

相关问题