Page MenuHome

Context object in custom driver changes properties and methods "randomly" and with handlers is incomplete
Closed, ArchivedPublic

Description

System Information
Operating system: Linux-4.15.0-46-generic-x86_64-with-Ubuntu-18.04-bionic 64 Bits
Graphics card: Radeon RX Vega ATI Technologies Inc. 4.5.13542 Core Profile Context 18.50.1.418

Blender Version
Broken: version: 2.80 (sub 52)

Short description of error
I know you are not supposed to use context in drivers, but this doesn't look fine when doing dir(bpy.context) in a driver it "randomly" changes between these 2. and with handles that it's supposed to be used T43385 , it prints only the first one that is broken

Like this nothing works

['__doc__', '__module__', '__slots__', 'area', 'bl_rna', 'blend_data', 'collection', 'copy', 'depsgraph', 'engine', 'gizmo_group', 'layer_collection', 'mode', 'preferences', 'region', 'region_data', 'rna_type', 'scene', 'screen', 'space_data', 'tool_settings', 'view_layer', 'window', 'window_manager', 'workspace']

Like this everything works

['__doc__', '__module__', '__slots__', 'active_base', 'active_bone', 'active_gpencil_frame', 'active_gpencil_layer', 'active_object', 'active_operator', 'active_pose_bone', 'area', 'bl_rna', 'blend_data', 'collection', 'copy', 'depsgraph', 'edit_object', 'editable_bases', 'editable_bones', 'editable_gpencil_layers', 'editable_gpencil_strokes', 'editable_objects', 'engine', 'gizmo_group', 'gpencil_data', 'gpencil_data_owner', 'image_paint_object', 'layer_collection', 'mode', 'object', 'objects_in_mode', 'objects_in_mode_unique_data', 'particle_edit_object', 'pose_object', 'preferences', 'region', 'region_data', 'rna_type', 'scene', 'screen', 'sculpt_object', 'selectable_bases', 'selectable_objects', 'selected_bases', 'selected_bones', 'selected_editable_bases', 'selected_editable_bones', 'selected_editable_fcurves', 'selected_editable_objects', 'selected_editable_sequences', 'selected_objects', 'selected_pose_bones', 'selected_pose_bones_from_active_object', 'selected_sequences', 'sequences', 'space_data', 'tool_settings', 'uv_sculpt_object', 'vertex_paint_object', 'view_layer', 'visible_bases', 'visible_bones', 'visible_gpencil_layers', 'visible_objects', 'visible_pose_bones', 'weight_paint_object', 'window', 'window_manager', 'workspace']

Exact steps for others to reproduce the error

For drivers this code

import bpy

def active_layer(dummy):
    print(dir(bpy.context))
    name = bpy.context.window.view_layer.name
    return bpy.context.scene.view_layers.find(name) 
bpy.app.driver_namespace['active_layer'] = active_layer

For Handlers this code

import bpy
from bpy.app.handlers import persistent

@persistent
def load_handler(random):
    print(dir(bpy.context))
    view_layer = bpy.context.window.view_layer
    bpy.context.scene.node_tree.nodes['Render Layers'].layer = view_layer.name
    
bpy.app.handlers.render_pre.append(load_handler)

Details

Type
Bug

Event Timeline

First context is not invalid, it’s just the default minimal context, while the other one is the 'screen' context. Anyway, relying of a specific type of context is not expected to work in a driver evaluation code…

As for handlers am not sure what exactly is the issue, nor what is expected to work in that context, @Campbell Barton (campbellbarton) should know more here?

Jacques Lucke (JacquesLucke) claimed this task.

I also do not see a bug here. Drivers and handlers just do not run within specific contexts, nor should they.