# Changing viewport shading with python

I am trying to change the viewport shading to "RENDERED" with python, but I can't seem to figure out how.

It seems like bpy.types.SpaceView3D.viewport_shade = "RENDERED" should do it, but this doesn't work and doesn't even give a context error.

You have to specify which 3D view you want to access.

For example, this will iterate through all the areas in the current screen and set any 3D views to rendered shading:

import bpy

for area in bpy.context.screen.areas: # iterate through areas in current screen
if area.type == 'VIEW_3D':
for space in area.spaces: # iterate through spaces in current VIEW_3D area
if space.type == 'VIEW_3D': # check if space is a 3D view


## Update

Alternatively, you could also do the following:

import bpy

area = next(area for area in bpy.context.screen.areas if area.type == 'VIEW_3D')
space = next(space for space in area.spaces if space.type == 'VIEW_3D')

Instead of looping through the whole bpy.context.screen.areas, etc, the next() method returns area as soon as it finds area.type == 'VIEW_3D'. This doesn't really affect performance for this example but it's a better way of achieving the same result. Plus, it looks neater!
• I'm getting 'SpaceView3D' object has no attribute 'viewport_shade' in 2.80. There is a shading attribute, but it is read-only. – Tomáš Hübelbauer Dec 19 '19 at 21:02
• blender.stackexchange.com/a/124427/68286 works - uses space.shading.type – Tomáš Hübelbauer Dec 19 '19 at 21:10