Category Archives: Renderfarming

Introducing the tks Suite

an expandable, customizable framework for compositing artists and supervisors

Years ago I was fortunate enough to spend nearly a year working with the wonderful guys at East Side Effects in NYC – not only did I get to work on a film for some of my favorite directors (the Coen brothers), but I was able to build the pipeline of my deepest artist dreams!

In the subsequent years, I have kept tinkering with it, until I have arrived at something I’m extremely proud of. The primary advantage (IMHO) of the tks Suite is that it was developed by someone who started as an artist, and therefore tries to provide the tools I wanted with the simple, easy-to-understand gui I always craved. What started as a purely-nuke panel for Artists has morphed into a full-featured, program-agnostic QT-based gui system for managing VFX workflow.

  • pure QT-based implementation
  • present Artists/Supervisors/Producers with only the information they need, with quick access to the actions they need to perform
  • modular “Action” system – adjust standard actions (Submit to Render Farm, Create Version/Publish) based on per-project settings
  • automated vfx pipeline from creating V0’s through review, publish and delivery creation
  • artist-focused for clarity and simplicity
  • tested and perfected on multiple AAA projects
Continue Reading →

Terminating a child process from python

I’ve been working on improving my renderfarm, and I’ve run into some trouble trying to close clients remotely. You can easily end a python process with sys.exit(), however if a rendering application (say Nuke) has been spawned by the script, it will not close. After some digging (and a bunch of great help from stackOverflow) I seem to have come up with a solution. When you call a 3rd party application with either call() or:

process = Popen(allRenderArg, env=os.environ)

Python will create a tiny, dummy process which only exists to call that application. When you exit your script, python will clean up those dummy processes, but won’t kill child processes, thereby leaving the renders going.

The solution that I’ve come up with is to get the pid of those dummy python processes, then use some unix commands to find the pids of their children, and kill them with os.kill(). If this was a linux platform I could do it in a more efficient way (possibly using pstree) but on OSX I have to use grep and some fancy code:

processId = process.pid
print "attempting to terminate "+str(processId)
command = " ps -o pid,ppid -ax | grep "+str(processId)+" | cut -f 1 -d \" \" | tail -1"
ps_command = Popen(command, shell=True, stdout=PIPE)
ps_output = ps_command.stdout.read()
retcode = ps_command.wait()
assert retcode == 0, "ps command returned %d" % retcode
print "child process pid: "+ str(ps_output)
os.kill(int(ps_output), signal.SIGTERM)
os.kill(int(processId), signal.SIGTERM)

There might be a nicer way, but I don’t know it.