最近很多脚本工作都需要脱离nuke的gui环境运行,没有了script editor就必须要尝试Nuke Python module功能了。该模式可以执行大部分在GUI环境中的命令,在自动生成或者批量处理nuke工程时非常高效。
下面简单介绍该模式:
从8.0版本开始Nuke就可以被当作一个python模块来使用了。
这意味着你现在可以在VFX流程中使用Python来做很多复杂的事,对于大部分的2DPython模块,3DPython模块以及视频编辑Python模块,这是一个易用的,产品级的,不可置信的,强有力的替代品。
无视python版本,通过Nuke你现在可以利用python.exe解释器而非Nuke.exe来充分的调用Nuke Python-API,来程序化的进行合成。这意味着你可以用python化的方法做一些事情,比如快速的对2000个镜头调色,或者通过五六行代码基于剪辑时间单子改变一系列淡入淡出效果的时间。你可以更容易的将Nuke连接到你的底层后端代码中,把Nuke集成到你的流程中甚至把Nuke放到其他的应用程序中。
要将Nuke作为一个Python模块使用你需要使用跟随Nuke一同装载的Python解释器(这个模块应该可以和其他的解释器一同工作,但随同Nuke一同装载的才受官方正式支持)。
作为一个标准Python模块,你既可以交互地使用这个解释器,也可以让它直接执行代码脚本。
你可以通过:
<Nuke8.0-install-path>$ python.exe xxx.py
这个方式来执行py脚本;也可以通过:
<Nuke8.0-install-path>$Nuke8.0v5.exe–t xxx.py
来执行py脚本;或者通过:
<Nuke8.0-install-path>$Nuke8.0v5.exe –x xxx.py
来执行py脚本。
实际上在后面两种方法中,通过使用-t参数,Nuke是被当作Python解释器执行的。
三种方法殊途同归,核心都是python解释器。
下面简单举一个例子:
class nukeScriptOperator():
script_path = os.path.dirname(cmds.file(q =1 , location = 1)) + '/' if os.path.exists('C:/Program Files/Nuke8.0v5/'): nuke_folder = 'C:/Program Files/Nuke8.0v5/' elif os.path.exists('C:/Program Files/Nuke8.0v1/'): nuke_folder = 'C:/Program Files/Nuke8.0v1/' elif os.path.exists('C:/Program Files/Nuke9.0v1/'): nuke_folder = 'C:/Program Files/Nuke9.0v1/' elif os.path.exists('C:/Program Files/Nuke9.0v5/'): nuke_folder = 'C:/Program Files/Nuke9.0v5/' else: nuke_folder = None def __init__(self,script,firstframe,lastframe): self.script = script self.firstframe = firstframe self.lastframe =lastframe self.SourceSeqs = None def writeRenderScript(self): commandStr = "# -*- coding: utf-8 -*- import nuke import sys nuke.scriptOpen('%s') writeNode = nuke.toNode('Write1') p = os.path.dirname(nuke.toNode('Write1')['file'].value()) if not os.path.exists(p): os.makedirs(p) firstframe = %s lastframe = %s nuke.execute(writeNode , firstframe , lastframe) print 'Success!'"%(self.script,self.firstframe,self.lastframe) f = open(script_path + 'Render.py','w') f.write(commandStr) f.close() def executePyScript(self): if nuke_folder == None: return None nukeCommand = "%s/python.exe %s%s.py"%( nuke_folder , script_path , PyScript ) subPopen = subprocess.Popen( nukeCommand , cwd = nuke_folder ) return None
首先构建一个名为nukeScriptOperator的类,添加writeRenderScript()及executePyScript()两个方法,其中writeRenderScript()类用于生成一个执行渲染的py脚本,executePyScript()方法用于执行渲染。
其中executePyScript()中的nukeCommand = "%s/python.exe %s%s.py"%( nuke_folder ,script_path , PyScript )
便是用于生成一条Commandline命令,之后传递给subprocess.Popen()方法执行。