Tell me more ×
Stack Overflow is a question and answer site for professional and enthusiast programmers. It's 100% free, no registration required.

I'm new to blender and python. I have a blender model (.blend) that I want to batch-render as several images providing some properties for each image.

I wrote a python script with those parameters, something like:

import bpy

pi = 3.14159265
fov = 50

scene = bpy.data.scenes["Scene"]

# Set render resolution
scene.render.resolution_x = 480
scene.render.resolution_y = 359

# Set camera fov in degrees
scene.camera.data.angle = fov*(pi/180.0)

# Set camera rotation in euler angles
scene.camera.rotation_mode = 'XYZ'
scene.camera.rotation_euler[0] = 0.0*(pi/180.0)
scene.camera.rotation_euler[1] = 0.0*(pi/180.0)
scene.camera.rotation_euler[2] = -30.0*(pi/180.0)

# Set camera translation
scene.camera.location.x = 0.0
scene.camera.location.y = 0.0
scene.camera.location.z = 80.0

So then i run it like

blender -b marker_a4.blend --python "marker_a4.py" -o //out -F JPEG -x 1 -f 1 

Then for instance if I try to use arguments to the python script

...
import sys
...
fov = float(sys.argv[5])
...

And run it:

blender -b marker_a4.blend --python "marker_a4.py" 80.0 -o //out -F JPEG -x 1 -f 1 

The render gets done but i get this messages at start.

read blend: /home/roho/workspace/encuadro/renders/marker/model/marker_a4.blend
read blend: /home/roho/workspace/encuadro/renders/marker/model/80.0
Unable to open "/home/roho/workspace/encuadro/renders/marker/model/80.0": No such file or directory.
...

Can anybody tell me whats causing this? I think blender is also parsing that as a model but don't understand why. I later tried something more sofisticated for the argument parsing in python (argparse) but it did not work at all. So i'm thinking there might be something strange happening at this level.

Thanks!

share|improve this question

2 Answers

up vote 2 down vote accepted

I found the solution for what I was looking for intially.

As Junuxx said "You can't pass command line arguments directly to python in this situation..." but you actually CAN pass arguments to python but in another situation.

So the way to do what i want is to RENDER AND SAVE DIRECTLY INSIDE the python script

import sys

fov = float(sys.argv[6])    
...
# Set Scenes camera and output filename 
bpy.data.scenes["Scene"].render.file_format = 'PNG'
bpy.data.scenes["Scene"].render.filepath = '//out'

# Render Scene and store the scene 
bpy.ops.render.render( write_still=True ) 

The --python option (or -P) has to be at the end and you can specify arguments with -- and just load the model and run the script.

> blender -b "demo.blend" -P script.py -- 50

Credit to this link I found: http://www.blender.org/forum/viewtopic.php?t=19102&highlight=batch+render

share|improve this answer
I get an error when running this code, because class RenderSettings does not have field file_format. It seems that it has been deprecated and removed. Is there any workaround? – user502144 Apr 17 at 18:02
Oh, I've figured out how to do this. file_format is now in ImageFormatSettings, so it should be bpy.data.scenes["Scene"].render.image_settings.file_format = 'PNG' – user502144 Apr 17 at 18:18
Ok! Sorry i missed your question. I you ommit that line it will save in PNG by default. But if you need another format that should be the way to go. – roho Apr 18 at 23:47

You can't pass command line arguments directly to python in this situation, because they are interpreted as arguments for blender. A way around this is to set environment variables and then call blender/python, like this (assuming you're on Windows - the same thing is possible on other OSs, but with different syntax)

set arg1='foo' & set arg2='bar' & python envvar.py

Note: no spaces adjacent to the equals signs!

In the python script I called envvar.py, you can use os.getenv() to access these variables

import os
print 'arg1 = ', os.getenv('arg1')
print 'arg2 = ', os.getenv('arg2')

Output:

arg1 = 'foo'
arg2 = 'bar'
share|improve this answer
I'm actualy on Linux but I could use it on a Mac also. This is a cool workaround and works but i'm not convinced by the OS-dependent approach. I was also thinking in using an auxiliary txt file. I found some more info here (its for blender 2.49 but i think its usefull) blender.org/documentation/249PythonDoc/API_related-module.html – roho May 20 '12 at 14:35
Yes reading from a text file would also work, but I thought it was more complicated than this. – Junuxx May 20 '12 at 15:22

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.