如何讓 Maya 裏的所有 message 都丟到 console 外頭?

Feb 24 2009

animation

redirect_maya_messages_to_console.png前天 Timothy 和我聊到一個非常有趣的事。

他因為工作需要,常常要批次(batch)處理一大堆的 Maya scene files,透過一些他自行寫的 scripts 來執行一些例行性的工作。然後他需要把 Maya 產生的任何 message 都以某種型式丟出來,方便他 debug 或是分析。我們兩個人在想,有哪些方法可以做到?(從這點可以看出來,Timothy 是一位非常稱職的 RD/TD,會汲汲於想一些方法來做 mass production,而不是手動一個一個處理。因為即使你手動做得再快,只要量一大,還是有一定的速度上限~)

我們最後釐清了需求:

  • Maya 會由 terminal/console 下執行,所有的 message 要能正常輸出,而不是只留在 Maya Script Editor 裏頭。
  • message 包括:Maya 本身產生的;Mel 的 print;Python 的 print。

解法:

  • 要讓 Python 的 print 得以輸出到 terminal,只要把 sys.stdout 由原來的 Maya Output object 換成 sys.stdout 即可。
  • 要讓 Mel 的 print 與 Maya 原生的 message 輸出到 terminal 的話,需要利用到 Maya API 裏頭 CommandMessage 所提供的 CommandOutputCallback。向 Maya 註冊一個 callback 後,每當有任何一個 command 的 output 時,這個 callback 就會被呼叫,然後我們可以來決定怎麼處理這個 output message。

For Python’s print:

import sys
sys.stdout = sys.__stdout__
dir(sys.stdout)
print "ooxx"

For Mel’s print and Maya command output:

def callback(nativeMsg, messageType, data):
    print nativeMsg, messageType, data
id = mo.MCommandMessage.addCommandOutputCallback(callback, None)

Testing of MEL:

print "ooxx from mel.print";

Testing of Python:

print "ooxx from python"

Testing of creating a sphere by GUI

Output in terminal/console:

ooxx
print "ooxx from mel.print";
0 None
ooxx from mel.print 1 None
print "ooxx from python"
sphere()
0 None
ooxx from python
name 'sphere' is not defined
# Traceback (most recent call last):
#   File "", line 2, in ?
# NameError: name 'sphere' is not defined 4 None
polySphere -r 1 -sx 20 -sy 20 -ax 0 1 0 -cuv 2 -ch 1;
1 None
pSphere1 polySphere1 5 None
;
1 None
saveShelf Custom "/home/drake/maya/8.5-x64/prefs/shelves/shelf_Custom";
0 None
1 5 None
saveShelf Toon "/home/drake/maya/8.5-x64/prefs/shelves/shelf_Toon";
0 None
1 5 None
saveShelf DGTOOL "/home/drake/maya/8.5-x64/prefs/shelves/shelf_DGTOOL";
0 None
1 5 None
saveShelf FL "/home/drake/maya/8.5-x64/prefs/shelves/shelf_FL";
0 None
1 5 None
saveShelf LightingTools "/home/drake/maya/8.5-x64/prefs/shelves/shelf_LightingTools";
0 None
1 5 None
saveShelf RL "/home/drake/maya/8.5-x64/prefs/shelves/shelf_RL";
0 None
1 5 None
saveShelf ShaderConverter "/home/drake/maya/8.5-x64/prefs/shelves/shelf_ShaderConverter";
0 None
1 5 None
saveShelf StereoTools "/home/drake/maya/8.5-x64/prefs/shelves/shelf_StereoTools";
0 None
1 5 None
Saving preferences to : /home/drake/maya/8.5-x64/prefs/userPrefs.mel 2 None
Saving window positions to : /home/drake/maya/8.5-x64/prefs/windowPrefs.mel 2 None
Saving hotkeys to : /home/drake/maya/8.5-x64/prefs/userHotkeys.mel 2 None
Saving named commands to : /home/drake/maya/8.5-x64/prefs/userNamedCommands.mel 2 None
Saving plug-in preferences to: /home/drake/maya/8.5-x64/prefs/pluginPrefs.mel 2 None
Preferences saved. See Script Editor for details. 2 None
comments powered by Disqus