像Minecraft Bukkit这样的Python插件

像Minecraft Bukkit这样的Python插件,python,plugins,Python,Plugins,我一直在读: 我正在尝试类似于Minecraft帮助系统的操作。 假设我有我的主模块,帮助命令是: 帮助 测试1 测试2 然后,在加载插件后,我将拥有相同的设置,加上插件可用的设置。 另外,在处理命令时,我该如何区分内部程序中的命令和插件中的命令 到目前为止,我已经想到了这个: import imp import os PluginFolder = "./plugins" MainModule = "__init__" def getPlugins(): plugins = []

我一直在读:

我正在尝试类似于Minecraft帮助系统的操作。
假设我有我的主模块,帮助命令是:

帮助
测试1
测试2

然后,在加载插件后,我将拥有相同的设置,加上插件可用的设置。
另外,在处理命令时,我该如何区分内部程序中的命令和插件中的命令
到目前为止,我已经想到了这个:

import imp
import os

PluginFolder = "./plugins"
MainModule = "__init__"

def getPlugins():
    plugins = []
    possibleplugins = os.listdir(PluginFolder)
    for i in possibleplugins:
        location = os.path.join(PluginFolder,i)
        if not os.path.isdir(location) or not MainModule + ".py" in os.listdir(location):
            continue
        info = imp.find_module(MainModule, [location])
        plugins.append({"name":i, "info": info})
    return plugins

def loadPlugin(plugin):
    return imp.load_module(MainModule, *plugin["info"])

disponiveis = []
for i in getPlugins():
    print("Loading plugin "+ i["name"])
    plugin = loadPlugin(i)
    plugin.run()
    disponiveis.append(i["name"])

while 1:
    foo = raw_input(":")
    if foo == 'quit':
        break;
    elif foo in disponiveis:
        print "ok"
    else:
        continue
与最初的示例没有太大区别:|
我最大的问题是加载所有插件的周期。
目前我有两个插件,hello和testing。我怎样才能拥有这样的东西:

send_command(plugin_name, action)
另外,if/elif有点蹩脚。。。可用命令应来自插件。

可能是用口授吗?!?!然后当加载插件时,它会将传统命令添加到该命令中

正如您引用的博客文章的最后一行所说,“当然,现在这个插件API非常简单,可以很容易(而且应该)根据您的程序需要进行扩展。”

示例代码中定义的唯一“api”是一个不返回任何内容的
plugin.run()
方法。因此,至少从你的问题听起来,你需要一个描述加载插件可用的“命令”。一种方法是定义所有插件必须提供的另一种方法,称为
available\u commands()
,它返回一个命令字典,其中键都是命令名,值是执行这些命令的相应函数


但是,这可能需要通过某种机制进行扩展,以便也向客户机应用程序提供命令参数信息。如何做到这一点,只取决于你的想象力,你可以自己发明一些东西,也可以通过在StackOverflow上问一个更具体的问题来了解别人是如何做到的。

谢谢你的回答和帮助,但我不应该试图重新发明轮子。
这个框架很棒:

工作起来很有魅力。

(了解更多关于Python的知识确实有帮助)

您的插件的结构是什么?它是一个类、方法吗?你向它传递了什么吗?博客的所有者发布了一个示例,但使其工作的唯一方法是在使用命令时始终加载模块:|也许我不理解你,但在我看来,在你可以执行它的一个命令之前,或者甚至询问它理解什么命令之前,必须加载一个插件似乎是合理的。主应用程序不可能知道任何关于它的信息,因为它们是在不同的时间编写的,至少在理论上是这样。我以后再发。