|
本帖最后由 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
查看全部评分
-
|