Title: Python Hashbang/Shebang
Slug: python-hashbang-shebang
Date: 2022-06-19 14:25:00
Author: Kartones
Lang: en
Tags: Development, Python, Troubleshooting, Operating Systems
og_image:
Description: The use of hashbangs or shebangs in Python scripts.

Until recently, I barely knew about [Hashbangs or Shebangs](https://linuxhandbook.com/shebang/) other than, when building a shell script, you have to put `#!/bin/bash` at the first line of the file.

What I wasn't aware is that you can create scripts out of many file types, because the hashbang is a declaration of which *interpreter* to use when running the script... which means that you can run things like Python files as scripts.

Python works as a really good cross-platform language because the `os` and `sys` libraries allow to build platform-independent code (e.g. via `path.join`). But there is a small catch that you need to be aware of when marking a file as a script.

In general, you should strive for always pointing to `python3`: 

`#!/usr/bin/env python3`

But if you still need to use python 2 (remember it reached end of life January 2020!) you should instead use `python2`:

`#!/usr/bin/env python2`

And, if you really need compatibility with both versions of python, the only solution is to use the generic `python`, because you can't specify both previous ones:

`#!/usr/bin/env python`

But here is the trick: Depending on the operating system, and especially on the more recent versions of Ubuntu, MacOS and the like, both the installed python version and/or any downloaded one might only be installed as `python3`. **There is no guarantee** that there will exist a symlink to the generic `python` (and can be dangerous to manually setup one).

How to solve supporting both versions then? Well, after reading the [PEP-394](https://peps.python.org/pep-0394/#recommendation), they advise to only use `python` if you plan to run the python script inside a virtual environment ([venv](https://docs.python.org/3/library/venv.html) or [virtualenv](https://pythonbasics.org/virtualenv/)). 

So there you have it, a two-step approach **to support both versions at once**:

a) Always run the script inside a virtual environment (easy if you use Docker nowadays).

b) Define the shebang as 

`#!/usr/bin/env python`
