我需要遵守我们从客户端收到的一些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那个叫那个?
答案 0 :(得分:0)
在这种情况下,subprocess.communicate()
将阻止子进程完成,因此它不会自行修复您的问题。
如果你只是想开始这些流程而不是等待他们完成 - 那么就会开火并忘记' style - 你可以只使用线程,从每个进程的新线程开始。但是,您必须非常小心地向用户报告 - 如果您尝试从外部线程触摸Maya场景或GUI,您将会发现神秘的,不可判断的错误。 print()
通常确定,但maya.cmds()
不是。如果您只是打印邮件,则可以使用maya.utils.executeDeferred()
in this question和in the docs来解决问题。