Maya Python API を使用する
 
 
 

Maya API のラッパ、イテレータ、関数セット クラスを使用した基本的なスクリプトを作成できます。これらのスクリプトは、Maya モデルを照会し操作することはできますが、Maya に完全に統合されているわけではありません。スクリプト プラグインは、Maya に強固に統合された、より複雑なソリューションを提供します。このセクションでは、基本のスクリプト、スクリプト プラグイン、そしてスタンドアローン型スクリプトを作成する方法について説明します。

Maya Python API は Python ベースの API なので、Python の知識が必要です。

モジュールをインポートする

Maya Python API は、いくつかの Python モジュールに内蔵されています。作成するスクリプトで使用する機能をインポートする必要があります。また、Maya Python API は Maya ネームスペース内に存在します。したがって、追加のプリフィックスが必要です。OpenMaya モジュールをインポートするには次を実行します。

import maya.OpenMaya

モジュールまたはクラスのヘルプ

help コマンドを使用して、任意のモジュールまたはクラスについての情報を表示できます。たとえば、MVector についてのクラス情報を表示する場合、次を使用します。

help(maya.OpenMaya.MVector)

また、モジュール全体についての情報を表示することもできます。

help(maya.OpenMaya)

OpenMaya モジュールは非常に大きいので、この操作が値を返すには時間がかかります。

スクリプトを作成する

Maya Python API モジュールには、Python プログラミングで使用可能なクラスが含まれています。これらのクラスは異なるカテゴリに分類され、その関連を示すための適切な命名規則を持っています。クラスには次のような種類があります。

MFn

このプリフィックスを含むクラスは、特定タイプの MObject 上で操作する関数セットです。

MIt

このクラスはイテレータで、MObject 上で関数セットとほとんど同じように動作します。たとえば MItCurveCV は、個々の NURBS カーブ CV(MFnNurbsCurveCV はありません)上で動作し、これをすべてのカーブ(の CV)上で繰り返し行います。

MPx

このプリフィックスを含むクラスはすべて「プロキシ」です。これは、ユーザ独自のオブジェクト型を作成したり、そこから派生させたりするために設計された API クラスです。

M クラス

これらのクラスのほとんどは「ラッパ」ですが、それ以外もあります。このクラスの例には、MVector、MIntArray などがあります。

ラッパ クラスと関数セット クラスを使用して、次のようなスクリプトを作成できます。

import maya.OpenMaya
vector1 = maya.OpenMaya.MVector(0,1,0)
vector2 = maya.OpenMaya.MVector(1,0,0)
vector3 = maya.OpenMaya.MVector(0,0,2)
newVector = vector1 + vector2 + vector3
print "newVector %f, %f, %f " % (newVector.x, newVector.y, newVector.z)

import コマンドを修正して、使用されているシンボル名を短くすることが可能です。

import maya.OpenMaya as OpenMaya
vector1 = OpenMaya.MVector(0,1,0)

スクリプトは、Maya Python API クラスを使用してディペンデンシー グラフの情報にアクセスすることができます。次のスクリプトでは、persp ノードを検索し、その translateX アトリビュート値を出力します。

# import the OpenMaya module
import maya.OpenMaya as OpenMaya
# function that returns a node object given a name
def nameToNode( name ):
 selectionList = OpenMaya.MSelectionList()
 selectionList.add( name )
 node = OpenMaya.MObject()
 selectionList.getDependNode( 0, node )
 return node
# function that finds a plug given a node object and plug name
def nameToNodePlug( attrName, nodeObject ):
 depNodeFn = OpenMaya.MFnDependencyNode( nodeObject )
 attrObject = depNodeFn.attribute( attrName )
 plug = OpenMaya.MPlug( nodeObject, attrObject )
 return plug
# Find the persp camera node
print "Find the persp camera";
perspNode = nameToNode( "persp" )
print "APItype %d" % perspNode.apiType()
print "APItype string %s" % perspNode.apiTypeStr()
# Print the translateX value
translatePlug = nameToNodePlug( "translateX", perspNode )
print "Plug name: %s" % translatePlug.name()
print "Plug value %g" % translatePlug.asDouble()

上の例は次のことを示します。

スクリプト プラグイン

スクリプト プラグインは、Maya に強固に統合されたソリューションの作成を可能にします。スクリプト プラグインにより開発者はコマンドのアンドゥ、Maya シーン ファイルへの適切な requires 行の構築などの機能をサポートすることができます。スクリプト プラグインを使用するもう 1 つの利点は、MEL と Python の両方で機能を使用きることです。

スクリプト プラグインを使用する

Maya プラグイン マネージャ(Plug-in Manager)が拡張され、スクリプト プラグインのロードとアンロードがサポートされるようになりました。

MAYA_PLUG_IN_PATH 上にあり、.py 拡張子で終わるファイルが、プラグイン マネージャに表示されます。ロード(Loaded)チェック ボックスまたは自動ロード(Auto Load)チェック ボックスのどちらかを選択して、スクリプト プラグインをロードまたは自動ロードします。

注:MAYA_PLUG_IN_PATH にプラグイン スクリプトではない .py スクリプトがあっても構いませんが、これらの項目はロードされません。エントリ ポイントが見つからないという内容の警告メッセージが発行されます。

プラグインは、プラグイン マネージャから、または MEL あるいは Python のコマンド タブからロードできます。MEL では、loadPlugin() コマンドを使用します。Python では、maya.cmds.loadPlugin() コマンドを使用します。

helixCmd.py などのサンプルを実行するには、プラグインをロードし、Python エディタ(Python Editor)のタブに次を入力します。

import maya
maya.cmds.spHelix().

この Python スクリプトを起動すると、次が実行されます。

このプラグインは、Python コマンド maya.cmds.unloadPlugin(「helixCmd.py」) を使用してもアンロードできます。

ロードと実行の手順は、MEL エディタ内でも次を使用して起動できます。

loadPlugin helixCmd.py;
spHelix();

スクリプト プラグインを作成する

スクリプト プラグインの作成には、プラグイン内で専用の関数を定義することが必要です。スクリプト プラグインは次を行う必要があります。

以下のセクションで、これらの項目についてサンプルとともに詳しく説明します。

インポート

Python は import キーワードを使用して、機能をモジュールからスクリプトにインクルードします。例:

import maya.OpenMaya as OpenMaya
import maya.OpenMayaMPx as OpenMayaMPx
import sys

スクリプト プラグインが複数のファイルに分割されていてもかまいません。import コマンドは、2 次ファイルの機能をスクリプト プラグインにロードするために使用します。

import polyModifier

すべての 2 次スクリプトは、スクリプト プラグインと同じディレクトリに配置する必要があります。

スクリプト プラグインを初期化する

スクリプト プラグインがロードされると、Maya は定義内の initializePlugin() 関数を検索します。この関数にすべてのプロキシ ノードが登録されます。

# Initialize the script plug-in
def initializePlugin(mobject):
	mplugin = OpenMayaMPx.MFnPlugin(mobject)
	try:
		mplugin.registerCommand( kPluginCmdName, cmdCreator )
	except:
		sys.stderr.write( "Failed to register command: %s\n" % kPluginCmdName )
		raise

initializePlugin() 関数が見つからない場合、スクリプト プラグインのロードは失敗します。また、ロード時、Maya は uninitializePlugin() 関数も検索します。これが見つからない場合、スクリプト プラグインのロードは失敗します。

スクリプト プラグインの初期化を解除する

Maya は、プラグインのアンロード試行時に、あらかじめ見つけておいた uninitializePlugin() 関数を呼び出して、プラグインのリソースをアンロードします。

def uninitializePlugin(mobject):
	mplugin = OpenMayaMPx.MFnPlugin(mobject)
	try:
		mplugin.deregisterCommand( kPluginCmdName )
	except:
		sys.stderr.write( "Failed to unregister command: %s\n" % kPluginCmdName )
		raise

クリエータ関数

クリエータ関数は、派生したバージョンのプロキシ クラスを Maya に返すために使用します。Maya から呼び出す派生クラスに、バーチャル メソッドが実装されます。以下は、クラス定義とクリエータ関数の例です。

class scriptedCommand(OpenMayaMPx.MPxCommand):
	# ...
def cmdCreator():
	return OpenMayaMPx.asMPxPtr( scriptedCommand() )

新しく作成したプロキシ オブジェクト上で OpenMayaMPx.asMPxPtr() を呼び出すことは非常に重要です。この呼び出しにより、オブジェクトの所有権が Python から Maya に移行します。この呼び出しを行わない場合、Python でこのオブジェクトの参照が解除され破棄されることがあるため、プログラム エラーが発生します。これにより、Maya にダングリング ポインタが残ります。

クラスの実装

プロキシ クラスの実装には、Maya Python API オブジェクトからの派生が必要です。

class scriptedCommand(OpenMayaMPx.MPxCommand):
	def __init__(self):
		OpenMayaMPx.MPxCommand.__init__(self)
	def doIt(self,argList):
		print "Hello World!"

scriptedCommand クラスは、OpenMayaMPx.MPxCommand から派生します。コンストラクタまたは __init__ メソッドは、親クラスの __init__ メソッドを呼び出す必要があります。すべてのクラス メソッドには、1 番目のパラメータとして self が必要です。この後、通常の引数リストが続きます。このコマンドの doIt() メソッドは「Hello World!」と出力します。

初期化関数

初期化関数は、MPxNode クラスを使用して新しいプロキシ ノードを定義するスクリプト プラグイン内で使用します。次は、その出力がサイン関数である単純なスクリプト プラグイン ノードを作成する方法を示すサンプルです。

import math, sys
import maya.OpenMaya as OpenMaya
import maya.OpenMayaMPx as OpenMayaMPx
kPluginNodeTypeName = "spSineNode"
sineNodeId = OpenMaya.MTypeId(0x8700)
# Node definition
class sineNode(OpenMayaMPx.MPxNode):
	# class variables
	input = OpenMaya.MObject()
	output = OpenMaya.MObject()
	def __init__(self):
		OpenMayaMPx.MPxNode.__init__(self)
	def compute(self,plug,dataBlock):
		if ( plug == sineNode.output ):
			dataHandle = dataBlock.inputValue( sineNode.input )
			
			inputFloat = dataHandle.asFloat()
			result = math.sin( inputFloat ) * 10.0
			outputHandle = dataBlock.outputValue( sineNode.output )
			outputHandle.setFloat( result )
			dataBlock.setClean( plug )
# creator
def nodeCreator():
	return OpenMayaMPx.asMPxPtr( sineNode() )
# initializer
def nodeInitializer():
	# input
	nAttr = OpenMaya.MFnNumericAttribute();
	sineNode.input = nAttr.create( "input", "in", OpenMaya.MFnNumericData.kFloat, 0.0 )
	nAttr.setStorable(1)
	# output
	nAttr = OpenMaya.MFnNumericAttribute();
	sineNode.output = nAttr.create( "output", "out", OpenMaya.MFnNumericData.kFloat, 0.0 )
	nAttr.setStorable(1)
	nAttr.setWritable(1)
	# add attributes
	sineNode.addAttribute( sineNode.input )
	sineNode.addAttribute( sineNode.output )
	sineNode.attributeAffects( sineNode.input, sineNode.output )
	
# initialize the script plug-in
def initializePlugin(mobject):
	mplugin = OpenMayaMPx.MFnPlugin(mobject)
	try:
		mplugin.registerNode( kPluginNodeTypeName, sineNodeId, nodeCreator, nodeInitializer )
	except:
		sys.stderr.write( "Failed to register node: %s" % kPluginNodeTypeName )
		raise
# uninitialize the script plug-in
def uninitializePlugin(mobject):
	mplugin = OpenMayaMPx.MFnPlugin(mobject)
	try:
		mplugin.deregisterNode( sineNodeId )
	except:
		sys.stderr.write( "Failed to register node: %s" % kPluginNodeTypeName )
		raise

nodeInitializer() 関数は、initializePlugin() 関数内で registerNode() に渡されます。プラグインのロード時、Maya は nodeInitializer() 関数を呼び出して、ノードのアトリビュートを作成します。

エラー条件

Maya Python APIでは、スクリプトの状態の照会と設定に Python の例外を使用します。ほとんとのケースでは、あるメソッドに戻り値があるとクラスのマニュアルに示されていても、例外が使用されます。例外が発生しうる状況にはいろいろあります。

  1. 呼び出しが失敗し、失敗の状態を保持する必要がある場合。
def uninitializePlugin(mobject):
	mplugin = OpenMayaMPx.MFnPlugin(mobject)
	try:
		mplugin.deregisterNode( sineNodeId )
	except:
		sys.stderr.write( "Failed to deregister node: %s" % kPluginNodeTypeName )
		raise

この例では、deregisterNode() 呼び出しが失敗した場合、uninitializePlugin() 呼び出しは Maya に例外を返し、プラグインのアンロードが失敗します。

  1. 呼び出しが失敗し、失敗の状態をクリアする必要がある場合。

このコードを修正してエラーをキャッチし、deregisterNode() 呼び出しが失敗した場合でもプラグインのアンロードを許可することができます。

def uninitializePlugin(mobject):
	mplugin = OpenMayaMPx.MFnPlugin(mobject)
	try:
		mplugin.deregisterNode( sineNodeId )
	except:
		sys.stderr.write( "Failed to deregister node: %s" % kPluginNodeTypeName )
		pass

唯一の違いは、raise キーワードが pass に変更されたことです。この技法は、正しくないオブジェクトを審査した場合に失敗するイテレータ コードを作成する場合に便利です。

3. 不明なパラメータ戻り値。

Maya Python API では、メソッドが特定のケースを処理できないことを示すため、不明なパラメータ戻り値を使用します。この操作を処理するかどうかは、呼び出し元が決定します。このようなメソッドのひとつに MPxNode::compute() があります。この状況では、Python コードは OpenMaya.kUnknownParameter を返します。

クラスでスライスをサポートする

すべての数値配列(MIntArrayMUintArrayMUint64ArrayMFloatArrayMDoubleArray)は、Python スタイルのスライスをサポートします。たとえば、次のようになります。

import maya.OpenMaya as OpenMaya array = OpenMaya.MUintArray() for i in range(0,9): 	array.append( i )
array[2:8:2]

# Result:[2, 4, 6] #

MPx クラスのスタティック MObject にアクセスする

プロキシ クラスは、開発者に対し、使用されているノードについての標準的な情報を提供します。これには、ノードの定義に使用するアトリビュート オブジェクトが含まれます。Maya Python API でスタティック クラス MObject にアクセスするためには、類似のコードを使用できます。

envelope = OpenMayaMPx.cvar.MPxDeformerNode_envelope

この呼び出し後、エンベロープは MPxDeformerNode::envelope の MObject になります。

メッセージ

Maya Python API では、メッセージ クラスをサポートしています。Python の関数が、コールバック用に渡されます。この関数は、コールバック メッセージが必要とするのとちょうど同じ数のパラメータを持つ必要があります。そうでない場合、メッセージ起動時に例外が発生し、コンソールに情報が書き出されます。ほとんどのメッセージと一緒に、Python オブジェクトの形式のクライアント データを渡すことができます。次はメッセージのサンプルです。

# Message callback
def dagParentAddedCallback( child, parent, clientData ):
	print "dagParentAddedCallback..."
	print "\tchild %s" % child.fullPathName()
	print "\tparent %s" % parent.fullPathName()
	print "\tclient data %s" % clientData
# Create the mesage
def createParentAddedCallback(stringData):
	try:
		id = OpenMaya.MDagMessage.addParentAddedCallback( dagParentAddedCallback, stringData )
	except:
		sys.stderr.write( "Failed to install dag parent added callback\n" )
		messageIdSet = False
	else:
		messageIdSet = True
	return id
# Call the message creator
messageId = createParentAddedCallback( "_noData_" )

割り当てを使用する代わりにパラメータ値を修正する

In Python, it is best to modify a parameter rather than using an assignment. The code below contains an assignment and demonstrates how an error can occur:
import maya.OpenMaya as OpenMaya 
def vectorTest(v): 
	lv = OpenMaya.MVector(1,5,9) 
	v = lv 
	print "%g %g %g" % (v.x,v.y,v.z) 
v = OpenMaya.MVector() 
vectorTest(v) 
print “%g %g %g” % (v.x,v.y,v.z)

2 番目の print コマンドは (0,0,0) を出力します。Python で、パラメータ値を修正するかコードを作成して、新しい値が返されるようにします。次のように vectorTest() 関数を書き換えます。

def vectorTest(v): 
	lv = OpenMaya.MVector(1,5,9) 
	v.x = lv.x
	v.y = lv.y
	v.z = lv.z
	print "%g %g %g" % (v.x,v.y,v.z) 

基本型へのリファレンス

Maya Python API には、int&、char&、float& など、基本型へのリファレンスとなる値またはパラメータを返す呼び出しがたくさんあります。Maya Python API では、すべてのリファレンスはポインタとして扱われます。結果として、これらの項目の値を作成、設定、アクセスするには、特別な呼び出しが必要になります。

これらの型の値を作成、取得、設定するためには、OpenMaya.py モジュールに存在する MScriptUtil というユーティリティ クラスを使用します。

引数を持つコマンド

引数を持つコマンドは、スクリプトとして作成された MPxCommand 内に MSyntax と MArgParser クラスを使用する必要があります。サンプルとして、次のコードを参照してください。

import maya.OpenMaya as OpenMaya
import maya.OpenMayaMPx as OpenMayaMPx
import sys, math
kPluginCmdName="spHelix"
kPitchFlag = "-p"
kPitchLongFlag = "-pitch"
kRadiusFlag = "-r"
kRadiusLongFlag = "-radius"
# command
class scriptedCommand(OpenMayaMPx.MPxCommand):
	def __init__(self):
		OpenMayaMPx.MPxCommand.__init__(self)
	
	def doIt(self, args):
		deg = 3
		ncvs = 20
		spans = ncvs - deg
		nknots = spans+2*deg-1
		radius = 4.0
		pitch = 0.5
		
		# Parse the arguments.
		argData = OpenMaya.MArgDatabase(self.syntax(), args)
		if argData.isFlagSet(kPitchFlag):
			pitch = argData.flagArgumentDouble(kPitchFlag, 0)
		if argData.isFlagSet(kRadiusFlag):
			radius = argData.flagArgumentDouble(kRadiusFlag, 0)
		controlVertices = OpenMaya.MPointArray()
		knotSequences = OpenMaya.MDoubleArray()
		# Set up cvs and knots for the helix
		#
		for i in range(0, ncvs):
			controlVertices.append( OpenMaya.MPoint( radius * math.cos(i),
				pitch * i, radius * math.sin(i) ) )
		for i in range(0, nknots):
			knotSequences.append( i )
		
		# Now create the curve
		#
		curveFn = OpenMaya.MFnNurbsCurve()
		
		nullObj = OpenMaya.MObject()
		try:
			# This plugin normally creates the curve by passing in the
			# cv's. A function to create curves by passing in the ep's
			# has been added. Set this to False to get that behaviour.
			#
			if True:
				curveFn.create( controlVertices,
								knotSequences, deg, 
								OpenMaya.MFnNurbsCurve.kOpen, 
								0, 0, 
								nullObj )
			else:
				curveFn.createWithEditPoints(controlVertices,
								3, OpenMaya.MFnNurbsCurve.kOpen,
								False, False, False)
		except:
			sys.stderr.write( "Error creating curve.\n" )
			raise
# Creator
def cmdCreator():
	# Create the command
	return OpenMayaMPx.asMPxPtr( scriptedCommand() )
# Syntax creator
def syntaxCreator():
	syntax = OpenMaya.MSyntax()
	syntax.addFlag(kPitchFlag, kPitchLongFlag, OpenMaya.MSyntax.kDouble)
	syntax.addFlag(kRadiusFlag, kRadiusLongFlag, OpenMaya.MSyntax.kDouble)
	return syntax
# Initialize the script plug-in
def initializePlugin(mobject):
	mplugin = OpenMayaMPx.MFnPlugin(mobject, "Autodesk", "1.0", "Any")
	try:
		mplugin.registerCommand( kPluginCmdName, cmdCreator, syntaxCreator )
	except:
		sys.stderr.write( "Failed to register command: %s\n" % kPluginCmdName )
		raise
# Uninitialize the script plug-in
def uninitializePlugin(mobject):
	mplugin = OpenMayaMPx.MFnPlugin(mobject)
	try:
		mplugin.deregisterCommand( kPluginCmdName )
	except:
		sys.stderr.write( "Failed to unregister command: %s\n" % kPluginCmdName )
		raise

このサンプルでは、クラスの doIt() メソッドに、シンタックス クリエータ関数とパース処理が含まれます。

保護されたメソッド

Maya Python API には、メソッドが所属するクラスからのみ呼び出されるメソッドがいくつか含まれています。Maya では、この保護がメソッドに適用されることを示すため、Python の指定に従って _ を付加しています。MPxNode クラスに、このようなメソッドのサンプルがいくつかあります。

_forceCache()
_setMPSafe()

Maya Python API 内では、保護されたメソッドの使用の要件を守ってください。

self が必要なのに API オブジェクトしか使用できない

Python でプロキシ クラスを実装する場合、処理の取得と設定処理のため、Python クラス内でメソッドを定義するのは自然です。たとえば、ベクトルをクラス変数として維持するとします。Maya Python API 内には、クラスの外に存在できるクラスのクリエータであるメソッドがあります。これらのメソッドはしばしばポインタ値を返します。Maya Python API では、これらのポインタ値は Python クラスの self と同一ではありません。結果として、self 上に定義されたクラス変数にアクセスするわかりやすい方法はありません。これは、ディクショナリと特別な関数 OpenMayaMPx.asHashable() を使用した解決方法によって可能です。

次の手順に従います。

  1. ディクショナリ オブジェクトを宣言します。
kTrackingDictionary = {}
  1. 対象オブジェクトの初期化メソッドで、OpenMayaMPx.asHashable() メソッドを使用してディクショナリに self を格納します。
	def __init__(self):
		OpenMayaMPx.MPxToolCommand.__init__(self)
		self.setCommandString(kPluginCmdName)
		self.__delta = OpenMaya.MVector()
		kTrackingDictionary[OpenMayaMPx.asHashable(self)] = self
  1. ポインタを使用して、ディクショナリから self を読み出します。
# Code is in a different class
# Pointer is returned
newCmd = self._newToolCommand()
# Use pointer to get to self of the command
self.__cmd = kTrackingDictionary.get(OpenMayaMPx.asHashable(newCmd), None)
# Set the class variable
self.__cmd.setVector(0.0, 0.0, 0.0)
  1. トラッキング ディクショナリをクリーンアップします。
	def __del__(self):
		del kTrackingDictionary[OpenMayaMPx.asHashable(self)]

この原理を示すサンプルについては、開発キットを参照してください。

オペレーティング システム タイプ

Maya Python API の一部のメソッドでは、<iosteam> オペレーティング システム タイプが必要です。これは Python に含まれていないので、このようなタイプのオブジェクトの作成と使用を行うための MStreamUtils クラスが使用可能です。このクラスの使用法を示すサンプルについては、開発キットを参照してください。

親クラスへの呼び出し

MPx プロキシ クラスを作成する場合、スクリプトで親クラスへの呼び出しが必要になることがあります。これは次のような表記法で行います。

matrix = OpenMayaMPx.MPxTransformationMatrix.asMatrix(self)

Enum 値

Enum 値は、次のように moduleName.className.value 表記法でアクセスすることができます。

OpenMaya.MSyntax.kDouble

OpenGL を使用する

OpenGL 機能をスクリプトで使用するためのラッパ クラス MGLFunctionTable を、サポートするすべてのプラットフォーム上で提供しています。このクラスへのリファレンスを取得するには、次のコードを使用します。

glRenderer = OpenMayaRender.MHardwareRenderer.theRenderer()
glFT = glRenderer.glFunctionTable()

ネストされたイテレータとガベージ コレクション

ネストされたイテレータを記述する場合、通常、外側のループで現在選択されている項目は、内側のループに渡されます。たとえば、MItSelectionList で現在選択されている項目は MItSurfaceCV イテレータに渡されます。内側のイテレータに、無効になった情報が保持されている場合には、ガベージ コレクションの問題が発生する可能性があります。この問題を回避するには、内側のループが完了したら、内側のイテレータをなし(None)にリセットします。この結果、外側のループを継続する前に、内側のイテレータの情報がリリースされます。現在選択されている項目をリビルドまたは更新している場合にはこれが重要です。

スタンドアローン型スクリプト

ラッパ クラスと関数セットを使用して Maya モデルを修正するためのスタンドアローン型スクリプトを作成できます。このスクリプトはコマンドラインから実行します。単純なスタンドアローン型「hello world」スクリプトは次のとおりです。

import maya.standalone
import maya.OpenMaya as OpenMaya
import sys
def main( argv = None ):
	try:
		maya.standalone.initialize( name='python' )
	except:
		sys.stderr.write( "Failed in initialize standalone application" )
		raise
	sys.stderr.write( "Hello world! (script output)\n" )
	OpenMaya.MGlobal().executeCommand( "print \"Hello world! (command script output)\\n\"" )
	
if __name__ == "__main__":
 main()

スタンドアローン型スクリプトが初期化されたら、関数セットとラッパ クラスを使用して Maya モデルの作成や修正ができます。これらのスクリプトの実行では、Maya と共に提供される Python 実行可能ファイルを使用する必要があります。たとえば、次のようになります。

$MAYA_LOCATION/bin/mayapy helloWorld.py