2010-12-22 119 views
0

我想创建一个插件系统,我有一个将所有模块导入到数组中的函数。插件的多个导入相同的文件名

布局:

PLUGINSDIR/

PLUGINSDIR /聊天

PLUGINSDIR /聊天/ main.py

这是查找并导入功能插件:

if os.path.exists(pluginsDir): 
    for path, dirArray, fileArray in os.walk(pluginsDir): 
     for fileName in fileArray: 
      if fileName == "main.py": 
      sys.path.append(path) 
      try: 
       plugins.append(__import__("main")) 
      except: 
       print 'Could not import plugin, "'+path+'": plugin contains errors or is not a real plugin.' 

这很好,如果我只有一个插件,但是当我有多个插件时,它会不断导入它检测到的第一个插件。插件的

布局:

PLUGINSDIR/

PLUGINSDIR /聊天

PLUGINSDIR /聊天/ main.py

PLUGINSDIR /建

PLUGINSDIR /编译/主.py

我试过在我的try语句后添加sys.path.remove(path),但是它并没有在我已经导入模块后删除路径。

我能做些什么来正确导入我的插件?

回答

4

sys.path.append(path)将插件文件夹附加到sys.path。由于Python从前到后搜索sys.path中的文件夹,因此在列表末尾追加其他路径将不会被找到,因为前面sys.path中指定的文件夹中的任何main.py模块实质上都会隐藏列表末尾的文件夹中的模块。相反,您可以使用sys.path.insert(0, path)将新路径添加到列表的前面。

您应该看看Python packages以更好地构建插件。

sys.path.insert(0, path_to_plugindir) 
for folder in dirArray: 
    __import__(folder) 
0

您的内循环不缩进,我不明白为什么您的代码运行。修复缩进可能会解决问题。

+1

那是因为我修改我的代码更可读的就在这里,但我最终带走了一些缩进:

plugindir/ __init__.py plugin1/ __init__.py plugin2/ __init__.py 

有了Python包,在你的脚本中的循环,可以方便地与实施。 – MetaDark 2010-12-22 16:51:35

2

Python模块系统只是处理命名空间的一种非常酷的方式。将多个具有相同名称的模块导入当前名称空间会使其混乱。

不需要遍历pluginsDir并导入每个文件,Python会为你做这件事(来自pluginsDir import *)。如果main.py只执行初始化stuf,则可以将代码移动到pluginsDir/chat/__init__.py

导入pluginsDir引用您的插件,如'pluginsDir.chat'被认为是更好的实践。

+0

我需要用我的方法来做到这一点,因为插件是动态的,而不是静态的,所以如果添加插件,我的脚本将无法使用此方法检测到它。 – MetaDark 2010-12-22 16:53:24

+0

您可以使用内置函数重新加载。 http://docs.python.org/library/functions.html#reload – 2010-12-22 17:09:12