【问题标题】:How to easy_install egg plugin and load it without restarting application?如何在不重新启动应用程序的情况下轻松安装 egg 插件并加载它?
【发布时间】:2011-03-14 22:42:44
【问题描述】:

我正在创建一个下载并安装其自己的 egg 插件的应用程序,但在 easy_install 将其提取到位后加载 egg 时出现问题。这就是它现在的工作方式:

  • App 将 egg 下载到临时文件夹中
  • 使用 setuptools.command.easy_install.main() 将 egg 安装到 ~/.app/plugins 文件夹(由 dist-packages 上的 pth 指向)
  • 此时,~/.apps/plugins/easy-install.pth 更新为新的 egg 路径

问题是在python进程重新启动之前pth不会重新加载,这意味着必须停止并重新启动应用程序(应用程序是一个长时间运行的进程,并且插件安装必须不需要重新启动)。

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

我可以创建一个函数来尝试猜测 easy_install 的路径或自行解析 pth,但如果可能的话,我宁愿不这样做。

Python 2.6,安装工具 0.6c9


感谢Marius Gedminas,我现在做的基本上是:

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

【问题讨论】:

  • 我对setuptools了解不多,但是你试过reload功能吗? docsstackoverflow.com/questions/437589/… ?
  • 是的,我做到了,但重新加载还不够。我尝试重新加载站点模块(我认为它负责读取 pth),但它什么也没做。即使 site.addsitedir(os.path.expanduser('~/.app/plugins')) 似乎将新的鸡蛋添加到 sys.path 列表中,也不足以使其可导入(导入插件名称)或可用于 pkg_resources .
  • zc.buildout 做了类似的事情,虽然我不想尝试阅读它的源代码。你试过在 distutils-sig 邮件列表上提问吗?

标签: python setuptools egg


【解决方案1】:

在浏览了documentation之后,我认为你需要做的是

pkg_resources.get_distribution(name).activate()

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

【讨论】:

  • 哇,没有注意到它会到处搜索以找到一个发行版,太棒了:)
猜你喜欢
  • 1970-01-01
  • 2013-11-04
  • 2019-12-15
  • 2017-08-13
  • 2014-07-21
  • 1970-01-01
  • 2019-08-04
  • 2019-02-24
  • 1970-01-01
相关资源
最近更新 更多