像Minecraft Bukki这样的Python插件

2024-10-03 21:30:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在读这个:
http://lkubuntu.wordpress.com/2012/10/02/writing-a-python-plugin-api/
我正在尝试做一些类似Minecraft帮助系统的事情。
假设我有我的主模块,帮助命令是:

help
test1
test2

然后,在加载插件之后,我将拥有相同的集,再加上插件可用的集。
另外,在处理这些命令时,我该如何区分内部程序和插件的命令?!
到目前为止,我想出了一个办法:

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

与原始示例相比不多:|
我最大的问题是加载所有插件的周期。
目前我有两个插件,hellotesting。我怎么才能得到这样的东西:

^{pr2}$

另外,if/elif有点蹩脚。。。可用的命令应该来自插件。
用一个dict也许?!?!然后当加载插件时,它会在dict中添加额外的命令?!?!在


Tags: namein命令info插件iffooos
2条回答

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

很有魅力。
(这确实有助于进一步了解Python)

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

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

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

相关问题 更多 >