maya对象属性_为何说maya的cmds是一种伪python接口?

点 击上方蓝字 CGRnDStudio 关注我们 “ CG TD编程技术相关领域自媒体 ”
  • maya启动的时候到底对cmds做了什么?

  • cmds包中为何空空如也?

  • 使用mayapy后台处理文件为何必须要加载standalone?

  • cmds为何不是一种面向对象的Python库?

  • mel与cmds哪种执行语言会快?

  • mel与cmds优缺点是什么?

  • cmds能完全替代mel吗?

  • cmds与pymel的区别又是什么?

带着上面的几个疑问,本篇文字来探讨一些答案

你有没有困惑过为什么我们一直在使用的cmds模块包中只有一个包的声明文件__init__.py,内容还是空的,如下图

maya对象属性_为何说maya的cmds是一种伪python接口?_第1张图片

如果我们直接打开mayapy.exe,通过dir(cmds)查询cmds的属性和方法,你会发现啥都没有

maya对象属性_为何说maya的cmds是一种伪python接口?_第2张图片

此处查询官方文档,它就会建议你先使用standalone来初始化maya之后才可以使用cmds

>>> from maya import standalone>>> standalone.initialize()

好奇这里的initialize方法初始化了什么? 可以顺藤摸瓜找到maya的启动脚本

# C:\Program Files\Autodesk\Maya2018\Python\Lib\site-packages\maya\app\startup\basic.py# Set up auto-load stubs for Maya commands implemented in libraries which are not yet loadedmaya.app.commands.processCommandList()

这里使用了processCommandList()方法将我们的mel command动态加载到cmds中

maya对象属性_为何说maya的cmds是一种伪python接口?_第3张图片

这个方法解析了commandList这个配置文件,我们用编辑器打开这个文件显而易见里面全部都是mel command,底层来自于dll库

maya对象属性_为何说maya的cmds是一种伪python接口?_第4张图片

我们看到cmds包是空的原因显而易见就是因为cmds所有方法都是启动maya的时候动态加载的,而且是直接对mel command做的简单包装,所以cmds只能算是披着python皮的mel command,自然也就不存在面向对象的封装了,执行时间理论上只有mel解释器与python解释器的区别。后台程序mayapy想正常导入cmds必须通过standalone初始化的行为也是显而易见的。cmds并不能完全替代mel,mel不单单有command还有很多function存在于C:\Program Files\Autodesk\Maya2018\scripts中,这些function不会被包装成cmds,所以遇到mel function想在python环境中使用就得使用maya.mel的模块来执行。cmds的优点是因为当前的执行环境是python,python所带来的强大可扩展的好处不是mel所能比拟的。至于pymel这并不是autodesk官方写的模块,它的出现就是解决cmds这种非面向对象的伪python所带来的问题,在pymel中遵循了面向对象编程以及pythonic风格。以上文字希望对你们理解cmds有所帮助。

参考文档来自智伤帝的博客:

https://blog.l0v0.com/posts/906141af.html

你可能感兴趣的:(maya对象属性)