Скрипт 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'