MEL to Python Cheat Sheet

Procedures vs. Functions

MEL

global proc myproc( string $arg1, int $arg2 )
{
    print ($arg1 + " " + arg2 + "\n" );
}

Python

def myfunc( arg1, arg2 ):
    print arg1, arg2

Scripts vs. Modules

MEL

source "myScript.mel";

Python

import myModule

In MEL, procedures are often readily available to use, even if you have not explicitly sourced the MEL script that contains it. This automatic availability is only achieved if a script is on the MAYA_SCRIPT_PATH and it contains a global procedure with the same name as the script. Many people are not aware of this caveat and it is a source of great confusion and inconsistent results.

Python has a more explicit set of rules. Any python script with a .py extension found on the PYTHONPATH is considered a module and must be imported inside every script that utilizes it. This usually occurs at the very top of a file. Think of it as a way of telling python and anyone else who looks at your module exactly what other modules it depends on.

Module Namespaces

The primary feature that conceptually distinguishes a module from a MEL script is that a module by default serves as its own namespace. In other words, once the module is imported, any functions contained inside it must be referenced with the module’s name as a prefix (without the .py extension):

import myModule
myModule.myfunc()

The concept of namespaces should be familiar to anyone who has used referencing in Maya. In Maya, namespaces provide organization and help avoid conflicts between the contents of each referenced file. And like Maya, python provides the ability to modify the default namespace when importing.

Here’s how you can change the namespace:

import myModule as mod
mod.myfunc()

or you can get rid of the namespace all together:

from myModule import *
myfunc()

Environment Variables

MEL Python
MAYA_SCRIPT_PATH PYTHONPATH

Vectors

MEL Python
<<0,1,2>> Vector(0, 1, 2)

tokenize

MEL

string $buf1[];
tokenize( "chad dombrova", $buf1 );
string $buf2[];
tokenize( "joint_01_left_leg", $buf2, "_" );

Python

::
buf1 = ‘chad dombrova’.split() buf2 = ‘joint_01_left_leg’.split(‘_’)