[python mel] execとsystemとsubprocess

mayaからexeを実行したい場合 melの場合はsytemとexecという2種類のコマンドがあります。
が、いまいち違いがわからないのでしらべてみました。

exec

シェルからバックグラウンド プロセスとして実行するコマンド。
返り値は、Windowsの場合正常終了した場合 0 が返される。
(Helpより)

system

文字列引数は、シェルで実行するコマンドです。
実行したコマンドの出力が文字列として返されます。
特になにも指定がない場合は、そのまま実行され 処理が終わるまで次のmelコマンドは実行されない。
バックグラウンドで実行する場合は
system(“start C:/test.exe”);
または
system(“load C:/test.exe”);
のように start load コマンドを使用する。
startコマンドがついている場合は、UIを立ち上げてバックグラウンドで実行
loadコマンドがついている場合は、 UIを立ち上げずにバックグラウンドで実行

こんな感じで、基本systemコマンドがexecの上位版と思って良い…のかな。

execの場合は バックグランドで処理が行われ、終了を待たずに次のmelコマンドを実行しにいくので
exeの処理が終わるまで待ち、次の処理をする などを使用する時は、systemコマンドを使う必要があります。
system(“start ~”) や system (“load ~”) を使用するときも同様にバックグラウンドで処理が始まるので
処理を待ってから何かする場合は要注意です。

私はこのせいでミスってました└(┐Lε:)┘

また、実行ファイルの標準出力をとりたいときもsystemコマンドを使用する必要があります。
execだと帰ってくるのは正常終了したかどうか で、systemとは結果が違います。

subprocess

もうちょっと手の込んだことをしようとした場合は、pythonの場合 subprocess というコマンドが存在するので
こっちをつかったほうが良いです。
PIPEでつないで STDIN とか STDOUT とか、STDERR とかとれるし、処理を待って実行とか 自由にできるのが素敵。

import subprocess
exeObj = subprocess.Popen(cmd)
exeObj.wait()
print “fin”

 

外部の実行ファイルを使ったりなんだするときはpython使いたいです(´・ω・`)
(というかmelもう使いたくない…)

コメントを残す

メールアドレスが公開されることはありません。


*