Run a Python script in Mac OS X Terminal
I’m sure this is self-evident for anyone with halfway decent knowledge of the Unix command-line, but it took me some searching through multiple sources to figure it out. (Kept getting env: python\r: No such file or directory errors whenever I tried to run the script on its own.)
If you need to run a Python script in the Mac OS X Terminal, save the script somewhere on your hard drive and run the following command:
python path/to/script [options]
Obviously, replace [options] with any options or arguments that the script accepts (or leave it off entirely). Remember that if you’re using bash for your shell, you can hit tab to autocomplete paths (which speeds things up a lot) and you’ll need to escape any spaces in paths with a backslash:
python ~/Documents/My\ Python\ Scripts/script.sh
Please note: I’m using OS 10.5; I believe the above will work with 10.2+ (since I think that’s when Python was bundled with the OS), but your mileage will vary. If you’re having issues, the Python documentation was one of the best resources I found, and of course the help file for the python command was useful once I figured out I needed to use a command other than running the script (type man python to access it).





Todd Ransom says...
You should be able to add a shebang line to the top of your script to avoid this:
#!/usr/bin/python
Also, don’t forget that on Unix systems the current directory is not usually in the path (on DOS-based systems it is always in the path). So if you are in a directory and want to run a script you have to do it like this:
./somescript.py
;)
Todd
Posted at 4:54 PM on May 18th, 2008 .:. Link ↑
Ian Beck says...
There actually was a line like that although it read #!/usr/bin/env python. I tried dropping the “env” and making it /usr/bin/python (since I’d peeked into the /urs/bin folder and seen what looked like a Python executable), but the script still failed. I’m not entirely sure why. Running it with the python command was the only way I could get it to work.
It might be that I need to configure the $path variable for my bash shell (it looked like it only included /usr/local/bin), but the syntax in the ~/.login file was confusing enough that I figured it would be safer not to mess with it (particularly since I had gotten the script to work).
Posted at 5:19 PM on May 18th, 2008 .:. Link ↑
Todd Ransom says...
ah, I bet your script does not have execute permissions on it. An ls -l will show you:
prometheus:bin kinch$ ls -l
…
-rwxr-xr-x@ 1 kinch kinch 1286 Dec 22 10:42 ftp-backup.sh
the first entry is the permission on the file for owner, group, and everyone. You can use chmod +x on the file to add execute permissions.
Todd
Posted at 6:48 PM on May 18th, 2008 .:. Link ↑
Ian Beck says...
Amusingly enough, I had set chmod +x on the file before trying to run it (after setting the permissions in the Finder Get Info window to no effect).
I don’t know what it was with this file, but it just demanded to be run with the python command. :-)
Posted at 7:20 PM on May 18th, 2008 .:. Link ↑
Todd Ransom says...
ok, I have one last thought and then I will give up on my obsessive problem solving of this non-issue. I think your file has Mac line endings (\r) instead of Unix line endings (\n), which is confusing your shell.
If you have TextMate you can save with Unix line endings from the save as dialog. If you don’t you just need to find some other way to replace the carriage returns with linefeeds. A simple python script maybe :D
Todd
Posted at 3:06 AM on May 19th, 2008 .:. Link ↑
Ian Beck says...
Ha; a Python script to fix my Python script would definitely solve all of my problems.
Posted at 6:07 AM on May 19th, 2008 .:. Link ↑
jonggunLee says...
you can use the command which name is ‘dos2unix’ and try again the python file. ^^
Posted at 6:19 AM on August 21st, 2008 .:. Link ↑
Ian Beck says...
Just a note for anyone trying to use Jonggun Lee’s suggestion: you’d better be using Windows to have it work.
Posted at 6:58 AM on August 21st, 2008 .:. Link ↑
Barry Webber says...
Todd, your first suggestion was spot on for me!
./scriptname.py solved my problem, thanks very much.
Not that I understand what is happening, because I can do ls -l at the prompt and see my script file, but entering that script filename at the prompt gets me ‘command not found’.
I guess more reading is called for when I get a new candle.
Barry
Posted at 2:06 PM on September 1st, 2008 .:. Link ↑
Barry Webber says...
Somewhere I came across the suggestion that a non-ascii script can have a problem. If UTF-8, there can be a ‘BOM’ marker at the front – invisible characters that get in front of the shebang #! and mess things up.
Barry
Posted at 2:13 PM on September 1st, 2008 .:. Link ↑
lord iglio says...
Thank you! Exactly what I was looking for.
Cheers!
Posted at 3:14 AM on April 25th, 2010 .:. Link ↑
juan says...
Hi,
I would like to know if there is a way to avoid the python launcher once you execute the code in terminal.
Posted at 3:21 PM on May 13th, 2010 .:. Link ↑