How to run python script at OS X Startup

3 min read 04-10-2024
How to run python script at OS X Startup


Running Python Scripts at OS X Startup: A Step-by-Step Guide

Want to automate tasks or run your Python scripts every time your Mac boots up? This guide provides a simple and effective way to achieve just that!

The Problem: Running Python scripts on startup is not a default feature in OS X. We need a way to tell the system to execute our script automatically when the computer starts.

The Solution: We can leverage the LaunchAgents mechanism, a powerful tool built into OS X that allows us to schedule tasks to run at specific intervals or events, including system startup.

Let's get started:

  1. Create your Python script: Make sure your script is functional and includes all necessary libraries. Let's assume your script is named my_startup_script.py and is located in your home directory's Documents folder.
# my_startup_script.py
import time

print("Hello from my startup script!")
time.sleep(5)
print("Script finished running!")
  1. Create a LaunchAgent file: In your home directory's Library/LaunchAgents folder, create a new file named com.yourname.your-script-name.plist. Replace yourname and your-script-name with appropriate values. The file should contain the following XML structure:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.yourname.your-script-name</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/bin/python3</string>
        <string>/Users/yourusername/Documents/my_startup_script.py</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>
  • Label: Unique identifier for your script.
  • ProgramArguments: Path to your Python interpreter and script.
  • RunAtLoad: Ensures the script executes at system startup.
  1. Adjust paths: Make sure to replace /usr/bin/python3 with the path to your Python 3 installation if it differs from the default location. Update the script path to match your my_startup_script.py location.

  2. Load the LaunchAgent: Open your terminal and run the following command to load the plist file:

launchctl load ~/Library/LaunchAgents/com.yourname.your-script-name.plist
  1. Check logs: To verify if the script runs at startup, you can use the following command in your terminal:
log show --predicate 'processImagePath == "/Users/yourusername/Documents/my_startup_script.py"'
  1. Troubleshooting:
  • Permission issues: Ensure the script and the plist file have the necessary permissions.
  • Python version: Verify that the Python version specified in the plist file is correct.
  • LaunchAgent conflicts: If the script doesn't run as expected, check if other LaunchAgents might be causing interference.

Additional Tips:

  • Environment variables: If your script requires specific environment variables, add a EnvironmentVariables key to the plist file.
  • Schedule execution: You can use the StartInterval and StartCalendarInterval keys to schedule script execution at specific intervals or times.
  • Log messages: Incorporate logging into your Python script for debugging purposes.

Example:

This example demonstrates the process of running a Python script that prints the current time at startup:

  1. Create time_script.py:
import time

print(f"Current time: {time.strftime('%Y-%m-%d %H:%M:%S')}")
  1. Create com.yourname.time-script.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.yourname.time-script</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/bin/python3</string>
        <string>/Users/yourusername/Documents/time_script.py</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>
  1. Load the plist and check the logs:
  • launchctl load ~/Library/LaunchAgents/com.yourname.time-script.plist
  • log show --predicate 'processImagePath == "/Users/yourusername/Documents/time_script.py"'

Now, every time you restart your Mac, the time_script.py script will run and print the current time in your system logs.

By following this guide, you can seamlessly integrate your Python scripts into your OS X startup routine, automating tasks and enhancing your workflow.