最近很多腳本工作都需要脫離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 -*-\n\ import nuke\n\ import sys\n\ nuke.scriptOpen('%s')\n\ writeNode = nuke.toNode('Write1')\n\ p = os.path.dirname(nuke.toNode('Write1')['file'].value())\n\ if not os.path.exists(p):\n\ os.makedirs(p)\n\ firstframe = %s\n\ lastframe = %s\n\ nuke.execute(writeNode , firstframe , lastframe)\n\ 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()方法執行。