51

I want to run a python script without explicitly having to call "python" every time in my shell. I've tried to add the shebang #!/path/to/python but this does not seem to work. Does anyone know a work around this? Many thanks.

6
  • "this does not seem to work." The question does not seem to have a specific error message. Without the specific error, we don't seem to be able to guess what went wrong.
    – S.Lott
    CommentedFeb 14, 2011 at 16:01
  • It's called the shebang #!/usr/bin/pythonCommentedSep 11, 2016 at 7:27
  • Also 'chmod a+x' the file, and add the directory to the PATH
    – Mukherjee
    CommentedSep 11, 2016 at 7:42
  • Which is your DE?CommentedSep 11, 2016 at 8:40
  • Could somebody please explain what the PATH is? And how I can add my directory to it?
    – St4rb0y
    CommentedSep 12, 2016 at 8:50

5 Answers 5

116

You've got to add the shebang:

#!/usr/bin/env python 

Then make the script executable:

chmod +x foo 

Then you can run it like any other executable:

./foo 

And a note from Homer6: if you're editing the file from windows and invoking it on linux, you may run into the cryptic "No such file or directory" error. It's due to the line endings of the lines being CRLF instead of LF. If you convert them to LF, the script will execute as expected. Notepad++ > View > Show Symbols > Show End of Line to show the EOL characters. And Notepad++ > Edit > EOL Conversion > Unix Format to convert all line endings to use LF. Alternatively, you can use the dos2unix tool (dos2unix foo.py), which is present on most Linux systems.

6
  • 1
    As a side note: it's better to use /usr/bin/env than the path to Python in the shebang line: if you hard-code a path, the script will stop working if Python is ever moved… But so long as Python is on $PATH, /usr/bin/env will work.CommentedFeb 14, 2011 at 15:05
  • Well, strictly speaking, env could be located elsewhere as well. But yes, that's much less propable than running the script on some other distro that happens to put python somewhere else.
    – user395760
    CommentedFeb 14, 2011 at 16:29
  • That's true. But I don't know of any other, more portable, way of doing it.CommentedFeb 14, 2011 at 17:10
  • 2
    Another note: if you're editing the file from windows and invoking it on linux, you may run into the cryptic ": No such file or directory" error. It's due to the line endings of the lines being CRLF instead of LF. If you convert them to LF, the script will execute as expected. Notepad++ > View > Show Symbols > Show End of Line to show the EOL characters. And Notepad++ > Edit > EOL Conversion > Unix Format to convert all line endings to use LF.
    – Homer6
    CommentedNov 13, 2012 at 18:35
  • On gvim for windows, I think :set ff=unix then saving fixes this issue.CommentedJun 12, 2013 at 15:55
8

It didn't really apply to your personal scripts but as you are quoting beets, note that it is also possible to automate this action when you are distributing your packages, thanks to setuptools entry_point option.
So if you are distributing a package like myModule and want to make the main_function() function accessible via typing mymodulescript in the console you would probably add something like this to your setup.py file :

setup( # your other arguments .. entry_points={ 'console_scripts': [ 'mymodulescript = myModule:main_function' ] } ) 
    3
    1. Add a line at the top of your script:

      #! /usr/bin/env python 
    2. Rename your script from script_name.py to script_name
    3. make the script executable: chmod +x script_name

    The line at the top selects the same python that you get when typing python at the prompt. You can also specify a direct path:

    #!/opt/python/3.6/bin/python 
    4
    • 5
      In addition, you need to add the location of the script to the PATH variable. otherwise you will need to execute it as ./script_name
      – Mukherjee
      CommentedSep 11, 2016 at 7:39
    • 1
      why did you suggest changing the name of the file? is there any repercussions of not doing that?CommentedAug 12, 2020 at 15:56
    • @VishalSingh The repercussion is that you have to type three extra characters to invoke the script, and for other it script_name (which should reflect the function it performs) less clear. There are primitive OS-es that need such extensions to determine which interpreter to start the Unix/Linux and their shells have long ago solved that in a better way. Leaving the extension makes you look inexperienced.
      – Anthon
      CommentedAug 12, 2020 at 19:11
    • Also, to paraphrase Charles Duffy, we don't use ls.elf or emacs.bin so why should your own commands have an extension?
      – tripleee
      CommentedOct 26, 2020 at 6:37
    3

    Another workaround could be to use an alias defined in the .bashrc :

    e.g. add the following line in your .bachrc file :

    alias mypythonalias="python mypyrhonfile.py" 

    type in terminal :

    source ~/.bashrc 

    and then you may simply type:

    mypythonalias 

    to execute the python file.

      1

      Ensure you are able to run /path/to/python on your terminal. And make sure you have given execute permission for your python file. You can give permission for the file by

      chmod +x mypythonfile.py 
      2
      • this is a bit late, but where do I put the chmod command...in command prompt? Thanks
        – lucyb
        CommentedFeb 7, 2017 at 19:08
      • 1
        @lucyb Yes, chmod is a Unix command which you would typically type at your shell prompt.
        – tripleee
        CommentedOct 26, 2020 at 6:37

      Start asking to get answers

      Find the answer to your question by asking.

      Ask question

      Explore related questions

      See similar questions with these tags.