| 
 | 
 
 本帖最后由 kkndbdra@tj 于 2019-6-4 18:52 编辑  
 
一般来说python用pip下载安装的模块包都不会有问题,这些模块自带path文件而且不包含mush的world对象。 
但是自己编写的模块,在导入的时候是有一些问题的。 
有的时候在文本编辑器里能导入的模块并且正常运作,但是打开了mush就会出现导入失败的情况。 
第一类问题:python找不到模块的导入路径 
 
这是MUSH对python支持的不大好。 
解决方案一 :如果把自己编辑的全部模块例如sjtest.py放在py项目的根目录能正常导入,但是模块多了会很凌乱。 
但是如果把所有的自编辑模块放在一个sjpython目录中便于管理又有可能出现python找不到相应模块的情况, 
这是因为自己编辑的模块没有编写.pth文件告诉mush去哪里导入模块。 
 
解决方案(二):自己制作一个.pth文件  随便 新建一个文本文档名称 
例如:sjpath.pth 放入py项目的site-packages文件夹中, 
例如我的py项目路径:C:\mushpy\venv\Lib\site-packages 
 
然后把自己编写的模块的文件夹目录存进去,例如我把所有的自编程模块放在以下路径:C:\mushpy\sjpython  就把C:\mushpy\sjpython这条路径存入到sjpath.pth中就可以了 
 
第二类问题:成功导入了模块但是找不到world对象 
其次就是要解决如何调在python模块中调用mush自带的world相关函数的问题。 
lua在模块文件中也可以直接调用world命名空间,很方便。 
但是world类被mush放在world的COM组件中,只有在mush程序开启的时候才能在能在python主脚本中调用。在模块脚本里面想直接导入是调用不了的。 
例如:你在模块文件test.py里写一个函数: 
#coding:GBK 
 
def pynote(): 
        world.note("大家好!") 
 
然后你在main.py中导入test.py模块然后调用这个函数会失败: 
#coding:GBK 
 
import sjpython.test 
 
sjpython.test.sjpynote(): 
 
 
这段文字的意思是Python解释器找不到world的定义位置,这是因为mush把world类被mush放在world的COM组件中,这个类只有在mush运行的时候才在内存里可见,但是python解释器在导入模块的时候是看不见的。 
 
解决方案:修改模块的代码,只用在代码顶部加一个定义world的空对象就行。 
#coding:GBK 
 
world = object  # 定义一个world的空对象类型,以免导入模块的时候报错 
 
def pynote(): 
        world.note("大家好!") 
 
加完这句话以后你会发现编辑器里"world.note"下面的红线消失了。 
 
 
然后在主文件import语句之后加一句编码,在MUSH运行的时候把内存里的world真实地址赋值给sjpython.test.world这个对象就行。 
代码如下: 
 
#coding:GBK 
 
import sjpython.test 
sjpython.test.world = world               # 把world的mush内存空间赋值给sjpython.test模块中的world对象 
 
sjpython.test.sjpynote():                # 
 
虽然在编辑器中看 world下面有红线,但是在mush开启后这个脚本是可以正常运作的。 
 
以此类推,所有的包含mush自带world函数的模块都可以这么处理。 
如果有多个模块就多写几个赋值语句把模块的world对象指向mush的world对象命名空间就行。 
不包含world类的模块应该可以直接正常工作的,我测试了好几个pip安装的第三方模块包都没有问题。 
 
然后就可以和普通py脚本一样正式开始编写python机器人啦! 
 |   
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册  
 
×
 
 
评分
- 
1
查看全部评分 
 
- 
 
 
 
 
 |