【问题标题】:Python plugins like Minecraft BukkitPython 插件,例如 Minecraft Bukkit
【发布时间】:2012-12-15 23:56:41
【问题描述】:

我一直在读这个:
http://lkubuntu.wordpress.com/2012/10/02/writing-a-python-plugin-api/
我正在尝试做一些类似 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

与原始示例相比不多:|
我的大问题是加载所有插件的循环。
目前我有 2 个插件,hellotesting。我该怎么做才能拥有这样的东西:

send_command(plugin_name, action)

另外,if/elif 有点蹩脚...可用的命令应该来自插件。
使用 dict 也许?!?!然后在加载插件时,它会将附加命令添加到该 dict ?!?!

【问题讨论】:

  • 你的插件的结构是什么?它是一个类,方法,你传递了什么给它吗?

标签: python plugins


【解决方案1】:

正如您引用的博客文章的最后一行所说:“当然,这个插件 API 非常简单,可以轻松(并且应该)根据您的程序需求进行扩展。”

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

但是,这可能需要通过某种机制进行扩展,以将命令参数信息也提供回客户端应用程序。如何做到这一点仅受您的想象力的限制,您要么自己发明一些东西,要么了解其他人是如何做到的,也许通过在 StackOverflow 上提出更具体的问题。

【讨论】:

  • 博客的所有者发布了一个示例,但使其工作的唯一方法是始终在使用命令的任何时候加载模块:|
  • 也许我不明白你的意思,但在我看来,在你可以执行它的命令之一之前必须加载一个插件似乎是合理的......甚至问它它理解什么命令。否则主应用程序无法了解它的任何信息,因为它们是在不同的时间编写的,至少在理论上是这样。
  • 别在意评论,我在代码中遗漏了一些东西。我稍后会发布。
【解决方案2】:

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

像魅力一样工作。
(它确实有助于了解更多关于 Python 的信息)

【讨论】:

    猜你喜欢
    • 2017-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多