How To Run Python Script When Blender Starts
GOAL
To run Python script when Blender starts only once or every time.
Environment
Blender 2.83
Windows 10
Method
I created a simple Python script “Documents\blenderPython\test\spheres.py” to add spheres as below
import bpy
for i in range(3):
bpy.ops.mesh.primitive_uv_sphere_add(radius=1, location=((i-1)*3, 0, 3))Only once
Start Blender with command
Start blender in command prompt with an argument -P or –python.
Reference: Python Options in Blender 2.91 Manual
blender -P Documents\blenderPython\test\spheres.py
The following is the result of startup scene.

Every time
Method 1. Create bat file.
Create batch file and start Blender with it. Save the command above as “blender_start.bat” and execute it.
Method 2. Hook the function to handler
To run script every time, use handler to execute functions when blender starts. This method can be used in your Addon.
Reference: Application Handlers (bpy.app.handlers) in Blender2.91 Manual
startup_sphere.py
import bpy
from bpy.app.handlers import persistent
@persistent
def add_sphere(dummy):
for i in range(3):
bpy.ops.mesh.primitive_uv_sphere_add(radius=1, location=((i - 1) * 3, 0, 3))
def register():
bpy.app.handlers.load_post.append(add_sphere)
def unregister():
pass
if __name__ == "__main__":
register()Put the file startup_sphere.py in the user startup directory such as C:\Users\<USER_NAME>\AppData\Roaming\Blender Foundation\Blender\2.83\scripts\startup. The files in the start up directory are executed when blender starts.
Reference: Script Loading in Blender Python API document
The following is the result of startup scene.

Wrong Example
You can’t put the python file that has operations of bpy.ops as below in user startup directory.
import bpy
for i in range(3):
bpy.ops.mesh.primitive_uv_sphere_add(radius=1, location=((i - 1) * 3, 0, 3))import bpy
from bpy.app.handlers import persistent
def add_sphere():
for i in range(3):
bpy.ops.mesh.primitive_uv_sphere_add(radius=1, location=((i - 1) * 3, 0, 3))
def register():
add_sphere()
def unregister():
pass
if __name__ == "__main__":
register()The error “AttributeError: ‘_RestrictContext’ object has no attribute ‘view_layer'” will occurs when the addon is activated. Check “[Blender Error] AttributeError: ‘_RestrictContext’ object has no attribute ‘view_layer’” for details.
You have a period on your import bpy
Thank you. I’ve corrected.