Re-Direct print back to the Script Editor

83 views
Skip to first unread message

Aaron Carlisle

unread,
Jul 28, 2016, 11:38:10 AM7/28/16
to Python Programming for Autodesk Maya
I wrote a logging system that redefines XStream and directs stdout and stderr to a Qt window so that I can also log output to a file (selectively).

This broke the Python print statement and the output of that will no longer show up in Maya's script editor.

Is there a way to reset Maya's internal Python printing? They're obviously doing something in the API because it include line endings and coloring output, I'm just not sure how to re-initialize it.

Any input would helpful!!

Thanks!

Robert White

unread,
Jul 28, 2016, 12:18:21 PM7/28/16
to Python Programming for Autodesk Maya
If you're on windows the following file is where the maya log handling stuff gets setup. Should be in a fairly similar place on other OSs

C:\Program Files\Autodesk\Maya2014\Python\Lib\site-packages\maya\utils.py

That should hopefully give you a starting point for how they're hooking into stdout/stderr and getting it to the script editor.
I honestly can't remember what I had done to get it logging to both a file and not interrupting the internal handler.

Aaron Carlisle

unread,
Jul 28, 2016, 7:01:47 PM7/28/16
to python_in...@googlegroups.com
So that actually got me looking in the right area! Thanks Robert.

Here's the solution:

Since I was overwriting XStream and redefining stdout I needed to reset stdout to point to Maya's output, but where is that? Well, the hint was staring me in the face, I just needed to find it; the answer was in plogging.py (pymel's logging system. There's a function called _fixMayaOutput and they use it to reset their own logging system.

So...
import sys
from maya import utils

# redefine sys.stdout
sys.stdout = utils.Output

# in order to use stdout 'write' requires a 'maya.Output' so we flush it
class MayaOutput(sys.stdout):
    def flush(*args, **kwargs):
        utils.Output = MayaOutput()
        sys.stdout = utils.Output

# initialize
log = MayaOutput()

# and flush, we're back to feeding output to the script editor
log.flush()

print("Hello World")

Thanks for your help Robert!

--
You received this message because you are subscribed to a topic in the Google Groups "Python Programming for Autodesk Maya" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/python_inside_maya/YdDjCgVM6Jw/unsubscribe.
To unsubscribe from this group and all its topics, send an email to python_inside_m...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/python_inside_maya/25ac4db1-4fb4-4a73-87e7-9501ccd834b6%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply all
Reply to author
Forward
0 new messages