Distinguishing Python
Kristine Middlemiss, Senior Developer Consultant
Autodesk Developer Network (ADN)
© 2012 Autodesk 1
Session Agenda
• Working with Modules
• Utilities functions
• Maya Standalone
• Python and MEL Scripting
© 2012 Autodesk 2
Working with Modules
Navigating the Maya Python namespace
© 2012 Autodesk 3
Maya Python Modules
maya Top-level module
maya.cmds Maya commands (e.g.
sphere, getAttr) and plug-in
commands
maya.OpenMaya* OpenMaya API modules
maya.utils Utilities not specific to API
or Maya commands
maya.standalone Initialization routine for
standalone Python
maya.app Python code used to
implement Maya
maya.mel.eval() Runs MEL commands as a
string
maya.stringTable This is the strings used to
built the UI, for localization
© 2012 Autodesk 4
Python Modules
• All Python functionality in contained in modules
• Modules may have hierarchy (e.g os.path)
• Import modules to access them
import maya.cmds
maya.cmds.sphere()
import maya.cmds as cmds
cmds.sphere()
from maya.cmds import *
sphere()
© 2012 Autodesk 5
Importing Modules
There are three forms of import:
1. Import a module using full namespace
2. Import a module using full namespace, but choose a
new name
3. Import an item from anther module into your global
namespace
© 2012 Autodesk 6
Using Modules
• To use a module in your code, use “import”
• “import” adds a module to the namespace of your code
• “import” searches sys.path
• Similar to “source” in MEL
© 2012 Autodesk 7
Script Modules
• Module is used to define closely related functionality
• Use Python "import" command to bring in modules
import myModule
myModule.myFunction()
# Result: 1 #
• reload" command updates module:
reload( myModule )
• Module must be available in path
© 2012 Autodesk 8
Python Path
• PYTHONPATH environment variable
• Read when Python initializes
• Stored in sys.path
• sys.path
• Can be modified after Python is initialized
© 2012 Autodesk 9
Scripts Path
• PYTHONPATH defines search path for scripts
• Includes standard Maya script paths
• Update at startup via Maya.env file
• Update from Python:
import sys
sys.path.append( "C:/scripts" )
© 2012 Autodesk 10
Maya Environment Variable
• Text file: Maya.env
• Recommended approach of setting environment variable
• Syntax:
PYTHONPATH = C:\Users\wengn\Documents\test
• Save it to
C:\Users\wengn\Documents\maya\2012\Maya.env
•
© 2012 Autodesk 11
Config File
• Create a userConfig.py file and add it to somewhere on
your path (PYTHONPATH)
• You can add imports and whatever
• Changes will show up in top level context
import maya.cmds as cmds
© 2012 Autodesk 12
Other Useful Modules (externally)
os process management,
environment variables,
etc
os.path file path routines: join, split,
etc.
sys shell arguments (argv),
python globals
re regular expressions
urllib2 URL access
pickle object archiving
getopt command line argument
parsing
math assorted math routines and
constants
© 2012 Autodesk 13
Utility Functions
© 2012 Autodesk 14
Utility Functions
• maya.utils
Utilities that are not API or Command specific are located in
maya.utils
Only two functions there so far
1. maya.utils.executeInMainThreadWithResult()
2. maya.utils.processIdleEvents()
© 2012 Autodesk 15
Utility Functions
• maya.utils.executeInMainThreadWithResult
• executeInMainThreadWithResult allows other threads
to call Maya routines which are not thread safe
• It only works from the GUI app as it uses idle events
• Thread blocks until main thread completes execution
• Any result or exception is passed to the calling thread
© 2012 Autodesk 16
Utility Functions
• maya.utils.executeInMainThreadWithResult
• executeInMainThreadWithResult can accept either a
string to evaluate or a Python function
def myProc():
return maya.cmds.ls()
res = maya.utils.executeInMainThread( myProc )
© 2012 Autodesk 17
Utility Functions
• maya.utils.processIdleEvents
• maya.utils.processIdleEvents() is mainly used for
testing
• It tells the idle queue to process existing idle events
• Returns True if all items on the idle queue were
processed
© 2012 Autodesk 18
Maya Standalone
© 2012 Autodesk 19
Importing Maya into external
interpreter
• Maya modules can be used within an external Python
interpreter as long as:
• version numbers match well enough
• environment is correct
• Maya ships with a “python” command in the bin directory
of the distribution
• Included “python” command sets up correct environment
and runs Maya’s version of Python
© 2012 Autodesk 20
Initialization
• Using Maya in a standalone Python interpreter is similar
to writing a library mode app using the API
• Maya must be initialized before Maya’s Python APIs are
used
• Initialization is done as follows
import maya.standalone
maya.standalone.initialize( name=’python’ )
• Initialization takes a while to run
© 2012 Autodesk 21
Python & MEL Scripting
© 2012 Autodesk 22
Maya Python Scripts
• All "Maya Commands" (previously called "MEL
Commands") now accessible from Python
• Exposed through the maya.cmds module:
MEL:
select pCube1;
ls –sl;
Python:
import maya.cmds
maya.cmds.select( “pCube1“ )
maya.cmds.ls( sl=True )
© 2012 Autodesk 23
Python vs. MEL
• Use a good text editor and don’t mix tabs and spaces
Tabs are 8 spaces by default
• You must explicitly import all external code
No auto finding of global functions
Global scope has a different definition in both languages
• All object names must be quoted
• Booleans in Python are “True” and “False” capitalized
• Importing a module again does not reload it
Use reload command instead (i.e. reload(maya.test.UtilsTest))
• Use PYTHONPATH instead of MAYA_SCRIPT_PATH
© 2012 Autodesk 24
Interoperability between scripting
languages
• Python can call MEL and MEL can call Python
• New Python scripts must hook into existing MEL-
based UI
© 2012 Autodesk 25
MEL to Python
• MEL has a new “python” command that can be used to
call into Python
• Takes a string containing Python code
• Returns the result of the computation
Basic Python types are converted into matching MEL type
(e.g.strings, ints, lists of ints, etc.)
All other types are converted into their string representation
import myModule
$result = python( “myModule.myMelProc()” )
© 2012 Autodesk 26
Python to MEL
• Python has maya.mel() function, which is possibly
• moving to maya.cmds.mel()
• Takes a string containing MEL code
• Returns the result of the computation
• All MEL return values are converted into a logical Python
value
result = maya.mel( “myMelProc()” )
© 2012 Autodesk 27
Python/MEL communication
• Invoke MEL from Python:
import maya.mel
maya.mel.eval( "ls -sl" )
# Result: ['pSphere1'] #
• Invoke Python from MEL:
“python” command
string $foo[] = python( "['a','b','c']" );
size($foo);
// Result: 3 //
© 2012 Autodesk 28
Python/MEL communication
• Accessing Python information from MEL
Python:
class MyFile:
_f = "mytestfile.txt"
mf = MyFile()
MEL:
string $f = python("mf._f");
print $f;
© 2012 Autodesk 29
Autodesk
© 2012 Autodesk 30