2016-03-21 69 views
0

私たちがクライアントから受け取ったいくつかのマヤシーンを、私たちのパイプラインと互換性を持たせるために適合させる必要があります。私はそのアクションをバッチ処理したいと思います。私はMayaの中からプロセスを起動するように求められます。
私は2つのメソッドを既に試してみましたが(どちらも似ています)、どちらも機能しますが、プロセスが完了するまでMaya GUIがフリーズするという問題があります。私はプロセスが作業者を守ることができるように、そして完了時にはメッセージだけを完全に透過的にしたいと思っています。ここ
は、私が試したものだと今まで見つかった:
ここにこのチュートリアル:http://www.toadstorm.com/blog/?p=136はこれを書いて、それを保存するために私を導い:サブプロセスコール中にMaya GUIがフリーズする

filename = sys.argv[1] 

def createSphere(filename): 
    std.initialize(name='python') 
    try: 
     mc.file(filename, open=True, pmt=False, force=True) 
     sphere = mc.polySphere() [0] 
     mc.file(save=True, force=True) 
     sys.stdout.write(sphere) 
    except Exception, e: 
     sys.stderr.write(str(e)) 
     sys.exit(-1) 
    if float(mc.about(v=True)) >= 2016.0: 
     std.uninitialize() 

createSphere(filename) 

そして、そのようにマヤの中からそれを呼び出すために:

mayapyPath = 'C:/Program Files/Autodesk/Maya2016/bin/mayapy.exe' 
scriptPath = 'P:/WG_MAYA_Users/lbouet/scripts/createSphere.py' 
filenames = ['file1', 'file2', 'file3', 'file4'] 

def massCreateSphere(filenames): 
    for filename in filenames: 
     maya = subprocess.Popen(mayapyPath+' '+scriptPath+' '+filename,stdout=subprocess.PIPE,stderr=subprocess.PIPE) 
     out,err = maya.communicate() 
     exitcode = maya.returncode 
     if str(exitcode) != '0': 
      print(err) 
      print 'error opening file: %s' % (filename) 
     else: 
      print 'added sphere %s to %s' % (out,filename) 

massCreateSphere(filenames) 

正常に動作しますが、私が言ったように、プロセスが終了するまではMaya GUIがフリーズします。それは球を作成するためのものなので、実際にシーンで実行する必要があるすべてのアクションにほとんど近づけません。
私はまた、mayabatchを呼び出す.batファイルを介して最初のスクリプトを実行しようとし、同じ問題をスクリプトを実行しようとしました。
私が探しているものと思われるこの投稿(Running list of cmd.exe commands from maya in Python)が見つかりましたが、それを自分の状況に適応させる方法がわかりません。
私の問題は、Popenをループ(複数回)で呼び出すことによって起こるかもしれないと思っていますが、実際には別の方法を見ることができません...おそらく、マヤからその電話を呼びますか?

答えて

0

この場合、subprocess.communicate()は、子プロセスが完了するまでブロックされるため、問題を単独で解決することはありません。

プロセスを開始し、完了するのを待たずに、「ファイアアンドフィアット」スタイルを使用したい場合は、プロセスごとに新しいスレッドを開始するだけでスレッドを使用できます。しかし、ユーザに報告することについて非常に注意する必要があります。外部のスレッドからMayaのシーンやGUIを操作しようとすると、不思議で不精なエラーが発生します。 print()です。通常 okですが、maya.cmds()はありません。メッセージを印刷しているだけの場合は、maya.utils.executeDeferred()というとin this questionin the docsで説明されています。

+0

ええ、それは私が実現したものです。 'subprocess.communicate()'を使わずに、さまざまなファイルを扱うために起動すると、コンソールは出力をプリントし、開いたときにすぐに閉じられました。 'maya.cmds'は大丈夫ではないと言って、あなたはそのメソッドを使ってマヤシーンでいくつかの変更を行うことをお勧めしません。リンクをありがとう、私は今すぐそれらを読むつもりです。 –

+0

基本的には、 'maya.cmds'から' maya.utils.executeDeferred'でラップされていない限り、メインのもの以外のスレッドから何も発行しないでください。これは少し簡略化されていますが、それは大雑把なルールです。あなたは_other_ mayaインスタンスで通常の方法で 'cmds'を使用することができますが、ユーザが見るものでは、スレッドからcmdsに触れないでください – theodox

+0

あなたの返事をありがとう。私は英語が私の主要な言語ではなく、自分自身でPythonを学んでいないことを認めなければなりませんが、いくつかのコンセプトを把握することはまだかなり難しいですが、私は掘り起こしていきます。私は今、私はいくつかの出力が必要なので、メインスレッドのサブプロセスを続けるつもりだと思います。 –

関連する問題