# Removing all material slots in one go

I need some help in removing all material slots in one go using a python script. I am able to use this, would prefer to ave all removed.

bpy.context.object.active_material_index = 0
bpy.ops.object.material_slot_remove()
bpy.context.object.active_material_index = 1
bpy.ops.object.material_slot_remove()
bpy.context.object.active_material_index = 2
bpy.ops.object.material_slot_remove()

• You'll find some good answers here Jul 29, 2019 at 17:07

You can also remove all material slots without calling the operator at all, so you don't have to bother with indexes:

bpy.context.object.data.materials.clear()


In general, I would always try to avoid calling operators unless they do something very specific that is difficult to achieve via calling usual API functions.

• That would remove the materials, not the slots. Jun 15 at 12:31
• Sort of. All materials get removed from the data-block by removing all material slots as well. Afterwards the materials do still exist, but they are no longer linked to the object. Unfortunately the Blender API is not very specific here. Jun 15 at 15:24

You can set the index of the list to 0, iterate through all slots and override the context of material_slot_remove():

for obj in bpy.context.selected_editable_objects:
obj.active_material_index = 0
for i in range(len(obj.material_slots)):
bpy.ops.object.material_slot_remove({'object': obj})

• Can you elaborate the part of overwriting the context? Apr 19, 2020 at 17:09
• Further reading: poll() failed, context incorrect? @MikeW Apr 19, 2020 at 18:40
import bpy #import the blender python library
for x in bpy.context.object.material_slots: #For all of the materials in the selected object:
bpy.context.object.active_material_index = 0 #select the top material
bpy.ops.object.material_slot_remove() #delete it