Raspberry Pi: Launch Python Script on Startup

Introduction: Raspberry Pi: Launch Python Script on Startup

About: Scott Kildall is an new media artist and researcher. He works at Autodesk, Pier 9 and is an artist-in-residence with the SETI Institute

As I've been working on my own Pi projects, I've been discovering many little tricks and tips by scouring various websites and assembling information, testing and optimizing.

So, here is another one of my "meat-and-potatoes" Raspberry Pi Instructables.

This Instructable will show you how to setup your Raspberry Pi to automatically launch a Python script upon startup.

First of all, I know this is a lame picture. If you can come up with a better one, I'm open to suggestions.

The Arduino has auto-launch built into it; the Pi does not. This will make your Pi a more powerful electronics platform and is essential if, for example, you want to use your Pi as a video kiosk using GPIO controls.

Before doing this Instructable, please make sure you have your Raspberry Pi up and running, which you can do with The Ultimate Raspberry Pi Configuration Guide Instructable.

I'm using the Mac OS for this guide, but you can extend the principles to other operating systems.

Step 1: Make a Launcher Sript

I'm building out a new project called Black Box Timelapse (Instructable coming soon...).

My python script is called : bbt.py and lives in a directory called bbt that is in the root directory. You can substitute your own director/Python script name instead of using mine.

We will use the Linux crontab to run the Python script.

I've had trouble with crontab and directory management and my solution is to amke a shell script, which always navigates to the proper directory and will launch my bbt.py Python script. 

Let's create the shell script!

I'm using ssh to access to Raspberry Pi. My IP address for the SD card for this is 10.0.1.68. Your IP address may be different — just change the address accordingly.

Open the Terminal window and on the command line, type:
ssh pi@10.0.1.68

If you are running directly hooked into the monitor, you can skip this step.

Type in:
cd bbt
then:
nano launcher.sh
Will launch your editor, type in this script

#!/bin/sh
# launcher.sh
# navigate to home directory, then to this directory, then execute python script, then back home

cd /
cd home/pi/bbt
sudo python bbt.py
cd /

Cntl-X, Return to save.

What this script will do is to navigate to the root directory, then to the bbt directory, launch the Python script and then return to the root directory.

Step 2: Make It Executable

We need to make the launcher script an executable, which we do with this command
chmod 755 launcher.sh
Now test it, by typing in:
sh launcher.sh
This should run your Python code.

Step 3: Add Logs Directory

We will get to using crontab in a minute, but first we need to make a directory for the any errors in crontab to go.

Navigate back to your home directory:
cd
Create a logs directory:
mkdir logs

Step 4: Add to Your Crontab

crontab is a background (daemon) process that lets you execute scripts at specific times. It's essential to Python and Raspberry Pi. The details are confusing, as is often the case with Linux. Once I got the hang of the format, I've found it to be incredibly easy to use.

Here's the Linux reference and here are some more crontab examples.

Type in:
sudo crontab -e
This will brings up a crontab window.

Now, enter the line:
@reboot sh /home/pi/bbt/launcher.sh >/home/pi/logs/cronlog 2>&1
What this does is rather than executing the launcher script at a specific time, it will execute it once upon startup.

Step 5: Reboot and See If It Works

Unplug the power or just type in:
sudo reboot
Wait for startup and see if your script automatically launches.

If it doesn't work, check out the log file:
cd logs
cat cronlog
This will show you any errors that you might have.

Step 6: Always Make an Exit Plan!

You'll want to have an easy way to exit the code, so that you don't get stuck in an endless buggy loop.

The way I do this is to plug in the keyboard (not plugged in for standard kiosk usage) and exit the script this way.

In a standard Python script, you can always hit cntl-C, which will exit.

If using the pygame libraries, you can do an exit on keydown, such as:
while not done:
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            done = True

Step 7: Extra: Crontab for Timed Scripts

Another way you can use crontab is to execute scripts at specific times, such as every minute, every hour, at a specific time. This is especially helpful for projects such as Twitterbots, which I'm using for my Bot Collective project

In this case, you want to make sure your Python script exits and isn't stuck in a loop, otherwise you may end up launching the script multiple times.

Here are some examples, with the same bbt.py/launcher code:

# every 2 minutes
*/2 * * * * /home/pi/justdiedbot/launcher.sh >/home/pi/logs/cronlog.log 2>&1

# at 6:22 EST, 3:22 PST (we are on PST); 15:22
22 15 * * * /home/pi/marktwainbot/launcher.sh >/home/pi/logs/cronlog.log 2>&1


Step 8: Done!

I hope this was helpful!
Scott Kildall

For more on Raspberry Pi code and other projects, you can find me here:
@kildall or www.kildall.com/blog

7 People Made This Project!

Recommendations

  • Make it Glow Contest

    Make it Glow Contest
  • First Time Author Contest

    First Time Author Contest
  • PCB Challenge

    PCB Challenge

101 Discussions

0
MFahad0308
MFahad0308

Question 20 days ago

Sir how do it this but with a virtual environment. I have a python script but i first need to activate it in order to run the file. How do i make so pi4 automatically activates that env and then run script inside that env?

0
bw09893
bw09893

26 days ago

Excellent write up and easy to follow unlike some others I have looked at. Thanks for posting it.

0
TH17
TH17

4 weeks ago

Excellent, thank you!!!

1
ParkerR11
ParkerR11

3 years ago

HELP! I did this and now I have a black screen on boot! What do I do?

0
thinker010
thinker010

Reply 8 months ago

see u have to remove the line from the crontab file. because ur program may require for desktop gui to boot n then ur program to work .......u can remove this by using ssh from laptop or install raspcontroller in ur phone get the ip address of pi n then login ,go to shell type sudo crontab -e . then remove the line from where u added it .
i hope this would help

2
Mr.S32
Mr.S32

Reply 3 years ago

What python script is executed?

0
graeme61
graeme61

1 year ago on Step 7

Hi Scott
I was looking for a way to start flightpi.py without having to go through the amount of typing on RPI Zero W.
Came across your .sh script to do this .
Followed steps 1 and 2 and it works perfect.
Will be using this simple script in future on RPI.
I use bash scripts on my Linux machines to start programs,but never used a .sh .
Now i see what the benefits are by using .sh scripts.
I have learned something new from you, today.
Kind Regards
Graeme

0
RichardC357

I tried this on a PI4, unfortunately it did nothing and no text was added to cronlog, i'm new to this so i'm not sure why?

also, you seem to need .save added to the end of .sh file to get the script to run.

0
dgkanade72
dgkanade72

Question 1 year ago on Introduction

Hello sir, Running Python script at boot works fine with crontab, only thing is that I am stuck to it. How to come out of it ?

0
SenTekin
SenTekin

Question 2 years ago on Step 8

Thank you for the tip. I followed as instructed and rebooted. My script supposed to say something like “Hi, everyone! “
It runs ok when I type
sh launcher.sh
however I see nothing when rebooted. I like to see the message displayed on desktop.
best regards,
Sentekin

0
Samarjeet Chavan
Samarjeet Chavan

2 years ago

This is the easiest and most helpful tutorial on this topic. I was literally going through various articles related to this issue but could find my solution for atleast a month until I dropped on this page.

0
NathanT93
NathanT93

Question 2 years ago on Step 6

Hey, where do I do the Ctrl+C to exit the script? My script runs upon rebooting but nothing else is opened, so there isn't like a terminal where the script is running for me to Ctrl+C.

0
GioloP
GioloP

3 years ago

I am having an error running my script on boot.

ImportError: no module named imutils

I have tested my script an it runs without errors, I also checked that it imports everything that is needed. But when I run it on boot (following the steps above) it seems it can't import modules. Is there anything else that I needed to do?

0
butterma
butterma

Reply 2 years ago

hi, I also have this problem. if you solve it may you share it with me?

thanks

0
adivganapathi
adivganapathi

Reply 2 years ago

remove the 'sudo'. Simply run 'python your_script.py'

0
plcabgut
plcabgut

2 years ago

i think its beter to check whether the process is running and if it fails relaunch

  1. Add this line to the file that just opened
    */5 * * * * pgrep -f myscript.py || nohup python /home/you/scripts/myscript.py > test.out

0
philocke
philocke

Reply 2 years ago

3 questions regarding this, as I'm new to linux:

1. what does the " */5 * * * * " portion of this code do?

timing - found the answer :)

2. what does the " > test.out " portion do?

3. Does this line get placed in the crontab file as the previous instructable indicates?

I like the functionality of monitoring and restarting my python script, as I'll have this on a headless Raspberry Pi that will be left unattended for days at least.

0
plcabgut
plcabgut

Reply 2 years ago

1 yes timing every 5 minutes

2 to save a log for debugging purposes

3 you can put a file in /etc/contrab.d named as you want with this line inside.

well finally I do it similar but a little different

1 create in /etc/crontab.d/ a file named ie.: mycron

2 write inside

*/5 * * * * root /root/myscript.sh

3 in file myscript.sh write

#!/bin/bash

# test if running and kill process
process_id=$(pgrep -f MYFILE.py)
if [ "$process_id" != "" ]; then
kill -9 $process_id
fi

# relaunch with nohup and in background the process MYFILE.py logging output to /tmp and error to null

nohup python /root/MYFILE.py > /tmp/results.log 2 > /dev/null &

0
philocke
philocke

Reply 2 years ago

Excellent! Thanks for the help! :)

0
AymarL
AymarL

Question 2 years ago

Hello, great tutoriel but i have a question im using the Desktop version (for needs to visualize my code) but now that it's running background how can i send Ctrl+C to it? how can i view it's terminal?