Maya GUI在子进程调用期间冻结

时间:2016-03-21 18:23:43

标签: python python-2.7 maya

我需要遵守我们从客户端收到的一些maya场景,以使它们与我们的管道兼容。显然,我想批量处理这个动作,并且我要求从Maya内部启动该过程。
我已经尝试了两种方法(彼此非常相似),这两种方法都有效,但问题是Maya GUI冻结直到进程完成。我希望这个过程对用户来说是完全透明的,这样他们就可以保留workind,并且只有在完成后才会显示消息。
这是我到现在为止所尝试和发现的内容:
这个教程在这里:http://www.toadstorm.com/blog/?p=136让我写这个并保存它:

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)

然后以这种方式从maya内部调用它:

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(即多次),但我真的不知道该怎么做......我想的可能是在磁盘上某处保存第二个脚本也是从Maya那个叫那个?

1 个答案:

答案 0 :(得分:0)

在这种情况下,subprocess.communicate()将阻止子进程完成,因此它不会自行修复您的问题。

如果你只是想开始这些流程而不是等待他们完成 - 那么就会开火并忘记' style - 你可以只使用线程,从每个进程的新线程开始。但是,您必须非常小心地向用户报告 - 如果您尝试从外部线程触摸Maya场景或GUI,您将会发现神秘的,不可判断的错误。 print() 通常确定,但maya.cmds()不是。如果您只是打印邮件,则可以使用maya.utils.executeDeferred() in this questionin the docs来解决问题。