1、Skulpt 版本不同导致 引入方式不同 两个版本有一点不同,导致 Pygame module 的github 文档 使用方法 失效
Sk.externalLibraries 为什么会失效了 在新版的时候弃用了 Sk.externalLibraryCache 方法去加载 externalLibraries 的文件代码。
那新版的Skulpt.js 必定要处理 模块的 引入问题 ==》 简化成 import pygame 怎么处理的
-
Sk.importModule(name, dumpJS, canSuspend)
-
Sk.importModuleInternal_ (name, dumpJS, undefined, undefined, undefined, false, canSuspend)
-
Sk.importSearchPathForName(searchFileName, ".js", searchPath)
-
Sk.read(filename)
主要是通过Sk.importModuleInternal_ 可以处理
Sk.importModule("pygame.display", false, false);
模块名为 pygame.display 在父节点上向上递归,导入pygame
Sk.importSearchPathForName 的 searchFileName 其实就是 pygame 和 pygame.display
再去调用 Sk.read(’src/lib/pygame.js‘) 该函数 Sk.read(x) 会去 Sk.builtinFiles.files对象取相应的值。在skulpt-stdlib.js上配置 Sk.builtinFiles.files = { "src/lib/turtle.js":code.js}
正常情况下 当调用 Sk.importModule("pygame.display", false, false); 的时候,在没有在加载pygame的情况下会去在加载一次pygame这个模块,再去加载 pygame下的display 模块。也就是说 程序应该 Sk.read(’src/lib/pygame.js‘) 再去 Sk.read(’src/lib/pygame/display.js‘)这才是合理的情况。 pygame.display =>pygame/display
但是 Skulpt.js 运行的结果确实 程序应该 Sk.read(’src/lib/pygame.js‘) 再去读取 Sk.read(’src/lib/pygame/display.js‘)。如果 和 Sk.builtinFiles.files的模块不起冲突一切正常。
但是当 pygame 的模块 和 skulpt-stdlib.js上配置的基础模块(他们都一个time的模块) 有冲突 就会导致程序异常了。
所以源码 处理 Sk.importModule("pygame.display", false, false) 这个的时候 应该 Sk.read(’src/lib/pygame.js‘) 再去 Sk.read(’src/lib/pygame/display.js‘)。
那为什么源码不是这样子处理的???
这句代码导致 searchFileName 原本pygame.display 变成 display 导致了 Sk.read(’src/lib/pygame.js‘) 再去读取 Sk.read(’src/lib/display.js‘)这个流程 。
但是 在 importSearchPathForName 这个方法中 name 参数进行 处理
pygame.display 转换成 pygame/display
大胆推测:
searchFileName = modNameSplit[modNameSplit.length-1];
这个代码是可以去掉。
运行python 的代码 模块的导入和模块之前重名的问题 都解决了