11 votes

Python script avec arguments pour la ligne de commande de Blender

Je suis nouveau dans blender et python. J'ai un modèle blender (.blend) que je veux convertir par lots en plusieurs images en fournissant certaines propriétés pour chaque image.

J'ai écrit un script python avec ces paramètres, quelque chose comme :

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

Alors je l'exécute comme suit

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

Ensuite, par exemple, si j'essaie d'utiliser des arguments pour le script de python

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

Et exécutez-la :

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

Le rendu est effectué mais je reçois ce message au démarrage.

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.
...

Quelqu'un peut-il me dire quelle en est la cause ? Je pense que Blender le considère également comme un modèle, mais je ne comprends pas pourquoi. J'ai ensuite essayé quelque chose de plus sophistiqué pour l'analyse des arguments en python (argparse) mais cela n'a pas fonctionné du tout. Je pense donc qu'il y a quelque chose d'étrange qui se passe à ce niveau.

Gracias.

9voto

roho Points 553

J'ai trouvé la solution à ce que je cherchais initialement.

Comme l'a dit Junuxx, "Vous ne pouvez pas passer des arguments de ligne de commande directement à python dans la section cette situation ..." mais vous POUVEZ en fait passer des arguments à python mais dans une autre situation.

Donc la façon de faire ce que je veux est de RENDRE ET SAUVEGARDER DIRECTEMENT DANS le script python.

import sys

fov = float(sys.argv[-1])   
...
# 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 ) 

L'option --python (ou -P) doit être à la fin et vous pouvez spécifier des arguments avec -- et juste charger le modèle et exécuter le script.

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

Crédit à ce lien que j'ai trouvé : http://www.blender.org/forum/viewtopic.php?t=19102&highlight=batch+render

4voto

Junuxx Points 7969

Vous ne pouvez pas passer des arguments de ligne de commande directement à python dans cette situation, car ils sont interprétés comme des arguments pour blender. Une façon de contourner ce problème est de définir des variables d'environnement et d'appeler ensuite blender/python, comme ceci (en supposant que vous êtes sous Windows - la même chose est possible sous d'autres OS, mais avec une syntaxe différente)

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

Note : pas d'espace à côté des signes égaux !

Dans le script python que j'ai appelé envvar.py, vous pouvez utiliser os.getenv() pour accéder à ces variables

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

Sortie :

arg1 = 'foo'
arg2 = 'bar'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X