Using the Command-line¶
This topic covers how to use the NUKE command line to execute Python scripts.
Running NUKE in Python Mode¶
NUKE can be executed in Python interpreter mode by using the -t argument. For example:
<Nuke-install-path>/Nuke13.0 -t
Nuke 13.0v1, 64 bit, built Mar 5 2021.
Copyright (c) 2021 The Foundry Visionmongers Ltd. All Rights Reserved.
>>>
To execute a Python script at startup, use the script file name after the -t switch:
<Nuke-install-path>/Nuke13.0 -t <mypythonscript.py>
Using Command-line Arguments¶
When NUKE runs a Python script, it passes the script arguments to the script in sys.argv.
For example, first make a file called test.py containing the following:
import sys, nuke
print('sys.argv: {}'.format(sys.argv))
Now run this from the command line to see what sys.argv contains:
<Nuke-install-path>/Nuke13.0 -t test.py Hello World!
Nuke 13.0v1, 64 bit, built Mar 5 2021.
Copyright (c) 2021 The Foundry Visionmongers Ltd. All Rights Reserved.
sys.argv: ['test.py', 'Hello', 'World!']
As you can see, NUKE passes the arguments after -t to the Python interpreter.
The only exception to this is if the last argument is a number or frame range. For example:
<Nuke-install-path>/Nuke13.0 -t test.py Hello World 1,2
WARNING: The command line argument ' 1,23' will be used as a Frame Range argument and will not be forward to the python sys.argv.
To define a frame range argument use the -F option.
Nuke 13.0v1, 64 bit, built Mar 5 2021.
Copyright (c) 2021 The Foundry Visionmongers Ltd. All Rights Reserved.
sys.argv: ['test.py', 'Hello', 'World!']
In this case, the 1,20 is stripped from sys.args and the frame range is available in nuke.tcl(‘frames all’).
To access all the command-line arguments passed to nuke you can use:
nuke.rawArgs
For example, edit the test.py to contain the following:
import sys, nuke
print('sys.argv: {}'.format(sys.argv))
print('nuke.rawArgs: {}'.format(nuke.rawArgs))
Now execute this:
<Nuke-install-path>/Nuke13.0 -t test.py Hello World 1,2
WARNING: The command line argument ' 1,2' will be used as a Frame Range argument and will not be forward to the python sys.argv.
To define a frame range argument use the -F option.
Nuke 13.0v1, 64 bit, built Mar 5 2021.
Copyright (c) 2021 The Foundry Visionmongers Ltd. All Rights Reserved.
sys.argv: ['test.py', 'Hello', 'World!']
nuke.rawArgs: ['./Nuke13.0', '-t', 'test.py', 'Hello', 'World!', '1,2']
Modifying Existing NUKE Scripts¶
It is sometimes useful to modify existing NUKE scripts using Python, for instance, when rewriting file paths.
The following script opens up a NUKE script on the command-line, rewrites all the write file paths, and finally saves the script:
### save this file as replaceWritePaths.py
import nuke
import os
import sys
def RecursiveFindNodes(nodeClass, startNode):
if startNode.Class() == nodeClass:
yield startNode
elif isinstance(startNode, nuke.Group):
for child in startNode.nodes():
for foundNode in RecursiveFindNodes(nodeClass, child):
yield foundNode
if len (sys.argv) != 5:
print('Usage: NUKE replaceWritePaths.py <nuke_script> <new_nuke_script> <in_file_pattern> <new_file_pattern>')
sys.exit(-1)
inScript = sys.argv[1]
outScript = sys.argv[2]
inPattern = sys.argv[3]
outPattern = sys.argv[4]
nuke.scriptOpen(inScript)
allWriteNodes = [w for w in RecursiveFindNodes('Write', nuke.root())]
for write in allWriteNodes:
path = write['file'].value()
path = path.replace(inPattern, outPattern)
write['file'].setValue(path)
nuke.scriptSave(outScript)
This example has the following syntax when run:
./Nuke13.0 replaceWritePaths.py <nuke_script> <new_nuke_script> <in_file_pattern> <new_file_pattern>
- Where:
<nuke_script> is the script to read in.
<new_nuke_script> is the name to save the modified script to.
<in_file_pattern> is string to search for in all the write file paths.
<new_file_pattern> is the string to replace <in_file_pattern> in all the write file paths.
Executing Frame Ranges¶
When running Python with the -t switch, NUKE does not render or execute any nodes by default.
To render a node you need to call:
nuke.execute(nodeName, firstFrame, lastFrame)
However, when you use the -x switch to render a frame range and you supply a Python file (.py) instead of a NUKE (.nk) script, NUKE executes the Python first and then renders all the writes in the script with the given frame range.
For example, save this script as convert.py:
import sys
import nuke
r = nuke.nodes.Read(file = sys.argv[1])
w = nuke.nodes.Write(file = sys.argv[2])
w.setInput(0, r)
Now, as an example, run the script from the command line as shown to convert some jpegs to tifs for 5 frames:
./Nuke13.0 -x convert.py myfiles.###.jpg myfiles.###.tif 1,5