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.
Teachers! Did you use this instructable in your classroom?
Add a Teacher Note to share how you incorporated it into your lesson.
Step 1: Make a Launcher Sript
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:
If you are running directly hooked into the monitor, you can skip this step.
nano launcher.shWill launch your editor, type in this script
# navigate to home directory, then to this directory, then execute python script, then back home
sudo python bbt.py
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
chmod 755 launcher.shNow test it, by typing in:
sh launcher.shThis should run your Python code.
Step 3: Add Logs Directory
Navigate back to your home directory:
cdCreate a logs directory:
Step 4: Add to Your Crontab
Here's the Linux reference and here are some more crontab examples.
sudo crontab -eThis will brings up a crontab window.
Now, enter the line:
@reboot sh /home/pi/bbt/launcher.sh >/home/pi/logs/cronlog 2>&1What 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
sudo rebootWait for startup and see if your script automatically launches.
If it doesn't work, check out the log file:
cat cronlogThis will show you any errors that you might have.
Step 6: Always Make an Exit Plan!
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