六六の魔法世界

注册

Maya技能 - 2022年3月26日

如何将Maya中的python脚本普通打印反馈到命令回显行

在Maya里生产工具通常会有需要给使用工具的艺术家返回一些信息,如操作错误的警告或者报错,但除此之外还可能需要打印一般性的信息,它不重要,只是为了告诉一些基本的事情,比如操作成功了如此之类。但在mel中打印的普通信息能够在Maya主视窗下的命令回显行,而python的普通打印却不能,因为python的打印总是会在打印信息的后面加一个\r,这会使它换行,而导致命令回显行显示不到应该出现的信息。而当这个需要是必须时工具创作者们只能在已有窗口或者新生成一个窗口来显示需要的信息,无疑这是很麻烦的,特别是当代码不会生成窗口时。

废话说一堆,解决这个的办法有两个:

1.使用sys模块的stdout.write方法:

import sys

sys.stdout.write('总是这样~哼!!')
#------------------------------------
>>总是这样~哼!!

这个方法可以直接在命令回显行中打印出信息,麻烦的是要引入一个新的模块,而且使用也要多打几个单词,对于我这样的懒癌患者来说很不友好。

2.在打印信息后加“,”:

print '总是这样~哼!!',
#------------------------------------
>> 总是这样~哼!!

这个方法简单方便,而且是比较正确的方法,至于它们是怎么避开python独有的在打印结尾加\r的我也不得而知。

这两个方法都同样有效,但在实验时你可能会发现,执行打印后再执行其它命令时,新的命令会和上次打印的信息排在同一行,虽然这对艺术家对工具的使用没有影响,但它似乎还是不符合常理的。但其实它也是正常的,不信我们在mel里执行两次打印:

mel打印

红色是第一次打印和结果,蓝色是第二次打印和结果。再看看使用python的两种方法:

sys方法打印
加逗号打印

可以看出,这和mel本身的打印几乎没有任何区别,就是正常的打印方法和结果。但仔细看使用加逗号打印时,打印的结果会在前面加一个空格,但它仍然不影响使用。

关于这个的讨论可以参考这里:https://forums.cgsociety.org/t/python-printing/1245049

如果加载缓慢请使用vpn。


号外:通过引用logging也可以打印出内容,切该模块提供了很多类型的返回。

import logging

LOG.info("这是普通打印")
>>># __main__ : 这是普通打印 #

可以看出,这个模块不仅能在Maya的反馈栏中打印出信息,它还会在信息前方列出打印信息所在环境路径,非常适合debug。有关logging的其它打印类型,可以百度查询。

但需要注意的是:即便是logging.error也不会打断代码的执行,这与cmds.error反常。