擅长:python、mysql、java
<p>我也有一个插件系统,有三种类型的插件,尽管我并不声称做得很好。您可以看到一些细节<a href="http://code.google.com/p/stv/source/browse/trunk/openstv/plugins.py" rel="nofollow noreferrer">here</a>。在</p>
<p>对于内部插件,我有一个包(例如,<code>MethodPlugins</code>),在这个包中是每个插件的一个模块(例如,<code>MethodPlugins.IRV</code>)。下面是我如何加载插件:</p>
<ol>
<li><p>加载包(<code>import MethodPlugins</code>)</p></li>
<li><p>使用<code>pkgutil.iter_modules</code>加载那里的所有模块(例如,<code>MethodPlugins.IRV</code>)</p></li>
<li><p>所有插件都来自一个公共基类,所以我可以使用<code>__subclassess__</code>来标识它们。</p></li>
</ol>
<p>我相信这可以让你在不加载插件的情况下识别插件,尽管我不这么做,因为我只是把它们全部加载。在</p>
<p>对于外部插件,我有一个用户可以放置它们的指定目录,我使用<code>os.listdir</code>导入它们。用户需要使用正确的基类,这样我才能找到它们。在</p>
<p>我也有兴趣改进这一点,但它对我来说也足够好了。:)</p>