2010-07-12 46 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

相關問題