windyhawk 发表于 2015-1-23 12:25:55

Mush中python调用模块的问题

在mush中用python如何调用module?目前我遇到的困难是:凡是跟mush需要直接相互交流的程序模块都必须在mush的scripting配置文件中而不能在一个主scripting文件调用的模块文件中。

例如:

在mush中配置的主scripting文件为:main.py,此外另有一个模块文件存有我定义的一些函数:my_module.py。 在main.py 中用“import my_module”来调用此模块。

如果我在mush中有trigger,把trigger中变量发送到script的函数Y(),但是此函数是在my_module.py中定义,而不是在main.py.

当trigger触发后,mush会出错显示,此函数Y()没有定义。所以貌似mush对主script文件main.py调用 的模块就不认。

请问这有什么解决办法吗?还是我哪里做错了。

另外我希望用模块的方式,这样方便功能扩展和管理。

北大侠客行MUD,中国最好的MUD

xxxcc 发表于 2015-1-23 13:05:29

方法1,
import my_module
from my_module import my_func
这样就可以了,简单快捷。但只能是全局函数,对于封装还是不够彻底。

方法2,
使用发送到 “10:执行(作为输入的命令重新分析)”
这样可以发送任何类的对象的任何函数,但是需要自己拼接生成调用函数的字符串。
封装的集成度高,但是写法比较丑陋,最好先用基类,处理一下这个问题,其他类再
调用就比较优雅了。

windyhawk 发表于 2015-1-25 04:10:05

回复 2# xxxcc


    还是不行,我那样做了,但是在import的模块函数中有用到world.的方法,比如world.GetTriggerWildcards,然后就出错,mush说不认识world,或者干脆说函数不能解析,但是在主script文件中的world语法,mush就能认,相同的函数放到主script文件中mush就可以顺利的执行。

不知道为什么,我参看littleknife的框架文件,他都是用模块来做的,可是调用起来很流畅。我不是太懂lua,不知道是不是Mush对lua的兼容要比python好的多,还是是我自己的问题。

xxxcc 发表于 2015-1-25 15:44:25

本帖最后由 xxxcc 于 2015-1-25 03:49 PM 编辑

回复 3# windyhawk
只要把主script中的world传递给模块文件就行了。

方法很多,比如直接将world作为参数传递给模块中的函数,或者直接把world作为类的属性,这样直接可以通过self.world来调用了。

lua确实是使用最方便的,python虽然写起来麻烦,但是python的第三方库很多....你懂的。

下面的压缩包可以稍作参考。

我也学python没几天,所以用的都是最基本的语法。

但是很好的实现了模块的分割功能。

xxxcc 发表于 2015-1-25 15:47:49

回复 3# windyhawk

windyhawk 发表于 2015-1-26 01:34:20

本帖最后由 windyhawk 于 2015-1-25 05:38 PM 编辑

回复 5# xxxcc


    非常非常感谢,我就说么!看小刀前辈的文件源码,他的模块里用了很多的self,我还以为是lua专用的语法。

我之所以坚持用python主要是工作中要用到,所以希望在玩这个游戏的时候也能有机会练习python:)

windyhawk 发表于 2015-1-26 01:45:04

回复 4# xxxcc


    另外一个问题,望不吝赐教。貌似很多人包括你的script里trigger的用法都是在script中设置trigger。是不是这样比在mush中设置trigger以后在script中调用更灵活,或者说还有其他优点?

xxxcc 发表于 2015-1-26 09:43:40

回复 7# windyhawk

基本上所有的trigger,我都做了底层的封装,将他们作为协程的一部分,优点是模块化程度高。
如果在Mush中设置,则会变得凌乱且难以维护。
比如睡觉函数,我是这么写的:
def Sleep(loop):
       subloop = Segment(loop)
       def Loop(segment)
            while True:
                      yield('singleline', u'^你一觉醒来...|^三分钟...|^你正忙...', 'sleep')
                      if u'醒' in segment.line:
                              break;
                      else:
                              yield ('timer', 5)
      subloop.Run(Loop)
这样就单独实现了一个睡觉的函数,不需要建立触发(当然底层还是使用触发方式),而且所有的
代码都在一个函数中,不需要额外设置trigger之类的,非常方便维护,比如发现了sleep某些情况下
无法正常运行的情况,那么只要在这个函数中修复了这个bug,所有调用Sleep的模块,都会解决这个
Bug。
使用也非常方便,比如:
def Study():
      if cp > 200:
            LearnFromZhuxi()
      else:
            Sleep()
这种写机器人的思路,我也在另外《远离触发》那个帖子里面提到了。
之所以在那边没上传代码,主要是觉得,既然使用了python,那么对编码肯定有自己独到的见解,
也不会轻易使用别人的代码,而且我的python也是刚学,代码上很多处理并不优雅,所以就只是
写一下思路。

windyhawk 发表于 2015-1-28 02:16:39

回复 8# xxxcc


    真是很有启发,多谢你耐心指导!希望以后能多向你学习。
页: [1]
查看完整版本: Mush中python调用模块的问题