Purpose of #!/usr/bin/python3


Question

I have noticed this in a couple of scripting languages, but in this example, I am using python. In many tutorials, they would start with #!/usr/bin/python3 on the first line. I don't understand why we have this.

  • Shouldn't the operating system know it's a python script (obviously it's installed since you are making a reference to it)
  • What if the user is using a operating system that isn't unix based
  • The language is installed in a different folder for whatever reason
  • The user has a different version. Especially when it's not a full version number(Like Python3 vs Python32)

If anything, I could see this breaking the python script because of the listed reasons above.

1
123
6/21/2017 1:37:05 PM

Accepted Answer

#!/usr/bin/python3 is a shebang line.

A shebang line defines where the interpreter is located. In this case, the python3 interpreter is located in /usr/bin/python3. A shebang line could also be a bash, ruby, perl or any other scripting languages' interpreter, for example: #!/bin/bash.

Without the shebang line, the operating system does not know it's a python script, even if you set the execution flag on the script and run it like ./script.py. To make the script run by default in python3, either invoke it as python3 script.py or set the shebang line.

You can use #!/usr/bin/env python3 for portability across different systems in case they have the language interpreter installed in different locations.

203
11/14/2018 7:51:09 PM

That's called a hash-bang. If you run the script from the shell, it will inspect the first line to figure out what program should be started to interpret the script.

A non Unix based OS will use its own rules for figuring out how to run the script. Windows for example will use the filename extension and the # will cause the first line to be treated as a comment.

If the path to the Python executable is wrong, then naturally the script will fail. It is easy to create links to the actual executable from whatever location is specified by standard convention.


Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow
Icon