blender python 构建节点树的脚本在命令行和 django 中工作,但在 Apache 之后失败(在 www-data 用户下)

blender python script building a node tree works in command line and within django, but fails behind Apache (under www-data user)

我有一个 python Blender 脚本,其中包含以下在渲染结束时构建去噪合成器的行。这在命令行和 blender GUI 中都有效。然后我写了一个 django web 后端 api,它使用子进程调用命令行并生成图像输出。 django app/api 渲染在 django 的 运行 服务器 (http://localhost:8000) 上运行良好。现在我将 api 暴露在外面,所以它作为 wsgi 应用程序位于 apache2 后面。 api 的其余部分不涉及搅拌机,所有工作都和以前一样好。但是我收到一个错误,似乎表明 www-data(apache 用户)的搅拌机后台子进程 运行 可能缺少一些关键数据。如果是,它是什么以及我该如何解决?

# part of the blender python script: scene.py
        ...
        node_tree = self.scene.node_tree
        node_render_layers = node_tree.nodes['Render Layers']
        node_composite = node_tree.nodes['Composite']
        node_denoise = node_tree.nodes.new(type="CompositorNodeDenoise")

        # link up the nodes
        node_tree.links.new(node_render_layers.outputs['Noisy Image'], node_denoise.inputs['Image'])
        node_tree.links.new(node_render_layers.outputs['Denoising Normal'], node_denoise.inputs['Normal'])
        ...

Apache2 的错误日志 - 请注意节点名称键在那里,但找不到节点的 output/input 键。

Traceback (most recent call last):
  File "/home/wr200m/workspace/art/src/py/main/blender/blender/scene.py", line 67, in <module>
    image_path = build_and_render_scene(asset, output_dir=output_dir)
  File "/home/wr200m/workspace/art/src/py/main/blender/blender/scene.py", line 50, in build_and_render_scene
    auto_blender.render_prep(samples=16, displacement_force_off=asset['displacement']==0)
  File "/home/wr200m/workspace/art/src/py/main/blender/blender/auto.py", line 245, in render_prep
    node_tree.links.new(node_render_layers.outputs['Noisy Image'], node_denoise.inputs['Image'])
KeyError: 'bpy_prop_collection[key]: key "Noisy Image" not found'

本质上,这个脚本在我 运行 时有效,我是一个普通用户:

$ /home/wr200m/software/blender-2.91.2-linux64/blender --background --python /home/wr200m/workspace/art/src/py/main/blender/blender/scene.py -- arg1 arg2

... SUCCESS ...

但是当 运行 作为 www-data(或作为 root)时它会失败:

$ sudo -u www-data /home/wr200m/software/blender-2.91.2-linux64/blender --background --python /home/wr200m/workspace/art/src/py/main/blender/blender/scene.py -- arg1 arg2

Blender 2.91.2 (hash 5be9ef417703 built 2021-01-19 16:16:34)
found bundled python: /home/wr200m/software/blender-2.91.2-linux64/2.91/python
Info: Deleted 3 object(s)
Info: Deleted 3 object(s)
Info: Deleted 0 object(s)
Info: Deleted 0 object(s)
Bricks001 1.3 0.01
Traceback (most recent call last):
  File "/home/wr200m/workspace/art/src/py/main/blender/blender/scene.py", line 67, in <module> 
    image_path = build_and_render_scene(asset, output_dir=output_dir)
  File "/home/wr200m/workspace/art/src/py/main/blender/blender/scene.py", line 50, in build_and_render_scene
    auto_blender.render_ep(samples=16, displacement_force_off=asset['displacement']==0)
  File "/home/wr200m/workspace/art/src/py/main/blender/blender/auto.py", line 245, in render_ep
    node_tree.links.new(node_render_layers.outputs['Noisy Image'], node_denoise.inputs['Image'])
KeyError: 'bpy_op_collection[key]: key "Noisy Image" not found'

我意识到 blender 后台进程没有读取我的 blender 首选项,就像我自己启动后台或 GUI 时那样:

# normally the following will spit out
Read prefs: /home/wr200m/.config/blender/2.91/config/userpref.blend

所以我想当我对自己之外的任何 id 执行 sudo 时,blender 不知道从哪里获得我的特殊设置。所以我像这样将 $HOME env 变量传递给 sudo 瞧。

$ sudo --preserve-env=HOME -u www-data /home/wr200m/software/blender-2.91.2-linux64/blender --background --python /home/wr200m/workspace/art/src/py/main/blender/blender/scene.py -- arg1 arg2
Blender 2.91.2 (hash 5be9ef417703 built 2021-01-19 16:16:34)
Read prefs: /home/wr200m/.config/blender/2.91/config/userpref.blend
found bundled python: /home/wr200m/software/blender-2.91.2-linux64/2.91/python

... SUCCESS ...