Скрипт Python с аргументами для командной строки Blender

Я новичок в блендере и питоне. У меня есть модель блендера (.blend), которую я хочу визуализировать как несколько изображений, предоставляя некоторые свойства для каждого изображения.

Я написал скрипт Python с этими параметрами, что-то вроде:

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

Итак, я запускаю это как

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

Тогда, например, если я пытаюсь использовать аргументы для сценария Python

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

И запустите это:

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

Визуализация завершена, но я получаю эти сообщения при запуске.

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

Кто-нибудь может сказать мне, что вызывает это? Я думаю, что Blender также анализирует это как модель, но не понимаю почему. Позже я попробовал что-то более изощренное для разбора аргументов в python (argparse), но это не сработало вообще. Так что я думаю, что на этом уровне может произойти что-то странное.

Спасибо!

2 ответа

Решение

Я нашел решение для того, что искал изначально.

Как сказал Junuxx "Вы не можете передавать аргументы командной строки напрямую в python в этой ситуации...", но вы на самом деле МОЖЕТЕ передавать аргументы в python, но в другой ситуации.

Таким образом, способ сделать то, что я хочу, состоит в том, чтобы рендерить и сохранять прямо в скрипте 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 ) 

Опция --python (или -P) должна быть в конце, и вы можете указать аргументы с помощью - и просто загрузить модель и запустить скрипт.

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

Ссылка на эту ссылку, которую я нашел: http://www.blender.org/forum/viewtopic.php?t=19102&highlight=batch+render

В этой ситуации нельзя передавать аргументы командной строки напрямую в python, потому что они интерпретируются как аргументы для blender. Обойти это можно, установив переменные окружения, а затем вызвать blender / python, например, так (при условии, что вы в Windows - то же самое возможно в других ОС, но с другим синтаксисом)

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

Примечание: нет пробелов рядом со знаками равенства!

В скрипте python, который я назвал envvar.py, вы можете использовать os.getenv() для доступа к этим переменным

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

Выход:

arg1 = 'foo'
arg2 = 'bar'
Другие вопросы по тегам