我正在創建一個應用程序,用於下載並安裝它自己的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()
我對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
是的,但是重新加載是不夠的。我嘗試重新加載站點模塊(我認爲它負責閱讀pth),但它什麼也沒做。 即使site.addsitedir(os.path.expanduser('〜/ .app/plugins')),它似乎將新egg添加到sys.path列表中,但不足以使其可導入(import plugin_name)或可發現爲pkg_resources。 – lkraider 2010-07-12 19:33:08
zc.buildout做了這樣的事情,雖然我不想嘗試閱讀它的源代碼。 你有沒有試過在distutils-sig郵件列表上提問? – 2010-07-14 18:13:56