【问题标题】:Creating module manager using Python?使用 Python 创建模块管理器?
【发布时间】:2012-04-03 06:59:18
【问题描述】:

我正在使用 Python 构建一个 IRC 机器人。我要求机器人是可扩展的,并希望构建一个模块系统,在机器人运行时检查模块并动态注册它们。例如,具有足够访问权限的人可以在 IRC 上发送类似“module enable feedparse”之类的内容,这将在 modules/ 目录中搜索 feedparse 模块。如果存在,则从模块本身的全局变量中获取模块的全名、版本和描述。然后它就地注册并启用该模块。

我该怎么做呢?谢谢!

【问题讨论】:

  • 这个问题比较模糊。您想“检查模块”并“即时注册它们”。我不知道“检查”模块是什么意思,也不知道“注册”是什么意思。也许您正在寻找的只是__import__()
  • 通过检查,我的意思是检查机器人“注册”所需的功能是否存在于模块中。通过注册,我的意思是导入它们,我猜想将触发器等“注入”到机器人中,以便模块立即生效。

标签: python irc bots


【解决方案1】:

我个人已经完成了以下工作,为您的模块创建了一个管理器,然后将您的模块作为完全独立的进程运行。

  • 这样重新加载进程就像杀死并运行它一样简单
  • 关机和开机很简单
  • 错误处理也是如此,因为您可以通过管道将 stderr 传送到 irc 频道。
  • 您还可以在不停止机器人或与 python 导入机制作斗争的情况下加载新模块

使用这种“管理程序”设计比担心模块重新加载或其他实现相同目标的方法要好得多。它还避免了 python 中可能发生的热代码重新加载问题。

如果您想要真正花哨,只需 subprocessmultiprocess 模块即可实现上述大部分功能

【讨论】:

  • 但是子进程是如何与主脚本通信的呢?即处理触发器,向终端发送状态消息。据我所知,“管理程序”设计对我来说会更有效。
  • 您只需将输入输入管道并读取输出,这取决于您要如何实现它
  • 那么,我将如何使用多处理?除了 Python 文档,还有什么相对简单的教程吗?
  • 对不起,我真的没有时间深入研究,把你的插件写成单独的程序,打开套接字、内存映射或共享数据结构,然后让它们自己旋转,为此我使用redis,每个程序都有自己的“队列”,所以一个插件可以做redis.rpop(“timePlugin:inbound”)->阻塞直到它得到一些东西,处理插件然后将它拍在“timePlugin:outbound”上,然后是客户端只需循环其插件键即可获取所有内容并将其拍打到频道,您也可以拥有专用或非专用频道来收听。嗯,让我编码一下
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-02
相关资源
最近更新 更多