python shebang linux is a syntax convention (#!) placed at the very top of a Python script on Unix-like systems, defining which interpreter (e.g., /usr/bin/python3 or /usr/bin/env python3) to use when the script is executed directly via its path. It enables script execution without explicitly invoking python3, streamlining automation and deployment workflows.
$ cat script.py
#!/usr/bin/env python3
print("Hello, World!")
$ chmod +x script.py
$ ./script.py
Hello, World!
A shebang line must be the first line of the script, start with #!, and contain no leading spaces. The kernel parses exactly one interpreter path and an optional single argument (e.g., -i). The line is limited to 127 bytes on most Linux kernels (BINPRM_BUF_SIZE).
Key features of the shebang line in Python
| Feature | Technical description | Real example |
|---|---|---|
| Absolute path | Fixed path to the interpreter, e.g. #!/usr/bin/python3. Distribution-dependent. |
#!/usr/bin/python3 |
Portable form (env) |
Uses /usr/bin/env to locate the interpreter in PATH. Recommended for virtual environments. |
#!/usr/bin/env python3 |
| Passing options | With env -S you can pass options to the interpreter (requires a modern env). |
#!/usr/bin/env -S python3 -i |
| Execute permission | The script must have the +x bit set via chmod for shebang execution. |
chmod +x script.py |
| Virtualenv compatibility | Shebang #!venv/bin/python3 directly forces the virtual environment interpreter. |
#!/home/user/venv/bin/python3 |
The choice between #!/usr/bin/python3 and #!/usr/bin/env python3 directly impacts portability. The absolute path is faster and avoids the overhead of env, but fails if Python is not installed at that exact location (e.g., systems using /usr/local/bin/python3). The env form respects the user’s PATH, which is crucial for virtual environments where the interpreter resides in a subdirectory. The shebang is interpreted only by Unix shells and the kernel’s execve system call—not by the Python interpreter itself.
Advantages and limitations of the Python shebang line
- Advantages:
- Allows direct script execution:
./script.pyinstead ofpython3 script.py. - Simplifies distribution of self-contained CLI tools.
- Compatible with the
if __name__ == "__main__"idiom for module/script duality. - Portable across distributions when using
env. - Direct integration with virtual environments (venv).
- Historically supported on all Unix derivatives (Linux, macOS, BSD).
- Allows direct script execution:
- Limitations:
- Does not work on Windows without WSL or manual
.pyextension association. - Incorrect interpreter path causes a cryptic
No such file or directoryerror. - Cannot pass multiple complex arguments without the
-Sflag ofenv. - The shebang line must be exactly the first line (no spaces, no BOM).
- It is a kernel/filesystem feature, not a Python language feature.
- In minimal containers lacking
/usr/bin/env, the portable form fails.
- Does not work on Windows without WSL or manual
Verdict: Best if you work exclusively on Linux/macOS and need executable scripts directly from the shell. Avoid if your primary audience uses Windows without WSL or if you require absolute cross-platform compatibility (in that case, prefer python3 script.py).
Comparison with alternatives
| Aspect | #!/usr/bin/python3 |
#!/usr/bin/env python3 |
python3 script.py (no shebang) |
|---|---|---|---|
| Portability between distros | Low (fixed path) | High (uses PATH) |
High (depends on user’s PATH) |
| Virtual environment support | Manual (edit path) | Automatic (inherits PATH) |
Manual (activate venv first) |
| Startup performance | Minimum (direct call) | Includes fork of env (~1 ms) |
N/A (always explicit python3) |
| Ease of distribution | High (self-contained script) | High (more portable) | Low (requires typing python3 each time) |
| Argument compatibility | Only fixed path | With -S allows options |
Full (interpreter receives flags) |
The #!/usr/bin/env python3 variant is the de facto standard in the Python community for executable scripts, being the official recommendation in PEP 394 and most packaging guides. The no‑shebang alternative is useful when you want to avoid filesystem dependencies or when running the script as a module (python3 -m my_module).
python shebang linux — Performance considerations and tuning
The #! shebang line incurs a fixed kernel overhead during execve(). The kernel reads up to 128 bytes (BINPRM_BUF_SIZE) from the script to parse the interpreter path and optional argument. Using /usr/bin/env python3 adds a fork/exec of /usr/bin/env, which searches $PATH—this extra process launch cost can be significant in high‑frequency script invocations. Verify interpreter location with which to avoid unnecessary PATH traversal:
- Hard‑coded path (e.g.,
#!/usr/bin/python3) is faster: singleexecve. - env‑style (
#!/usr/bin/env python3) adds one intermediate exec and a PATH search. - Shebang length – keep the line ≤ 127 bytes to avoid truncation (kernel silently ignores overlength lines).
- Permission errors (e.g.,
Permission denied) cause a wasted execve – always set the executable bit viachmod +x.
To inspect the interpreter binary (an ELF file that execve loads), use:
$ hexdump -C /usr/bin/python3 | head
00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............|
00000010 02 00 3e 00 01 00 00 00 00 aa 5f 00 00 00 00 00 |..>......._.....|
00000020 40 0
The kernel’s ELF loader (see Documentation/process/binfmt_elf.rst) handles the script’s shebang and then loads the interpreter. No user‑tunable knobs exist for the shebang parser itself; performance tuning focuses on reducing execve counts (e.g., batching script runs, using persistent interpreters like python3 -i with stdin redirection) and avoiding environment‑lookup overhead. For Python, the python -m venv approach (shown in context) changes the shebang via venv/bin/python3, but does not affect BINPRM_BUF_SIZE—that is a compile‑time kernel constant.
Closing
For executable Python scripts on Linux, the shebang line #!/usr/bin/env python3 is the most portable and recommended practice, combined with execute permissions and the if __name__ == "__main__" block; avoid absolute paths unless you work in a fully controlled environment without virtual environments.
Frequently Asked Questions
What is the difference between #!/usr/bin/python and #!/usr/bin/env python?
Answer: #!/usr/bin/python uses a hardcoded path; #!/usr/bin/env python resolves the interpreter from PATH , enabling portability across environments.
The hardcoded shebang breaks if Python is installed elsewhere (e.g., /usr/local/bin/python). The env variant searches PATH, supporting virtual environments and different distributions. Example:
#!/usr/bin/env python3
Always prefer env for cross-platform scripts.
When should I use the -S flag in a Python shebang?
Answer: Use -S to disable automatic import of the site module, reducing startup time and avoiding interference from local site-packages.
This flag is critical for containerized or highly isolated scripts where you control all dependencies. Example shebang:
#!/usr/bin/env python -S
It can also help troubleshoot import path issues.
How do I fix /usr/bin/env: ‘python’: No such file or directory?
Answer: Install Python explicitly or update the shebang to reference python3 (or the exact version present: python3.
This error occurs when Python is missing or not in PATH. Check available Python:
command -v python3 || ls /usr/bin/python*
Then correct the shebang, e.g., #!/usr/bin/env python3. On minimal systems (Alpine), you may need #!/usr/bin/python3 if env lacks.
Does #!/usr/bin/env python3 work on all Linux distributions?
Answer: Yes, across major distributions (Ubuntu, RHEL, Debian, Arch) assuming /usr/bin/env exists and Python 3 is installed under python3.
Exceptions: minimal Docker images (Alpine, BusyBox) may lack env; use hardcoded path instead. Verify compatibility:
docker run --rm alpine sh -c 'echo "#!/usr/bin/env python3" > /tmp/test.py && /tmp/test.py 2>&1 || echo "env missing"'
On most production servers, env is present.
What is the fastest way to determine the correct shebang for a Python script across multiple Linux environments?
Answer: Use #!/usr/bin/env python3 as the default.
Automated approach:
#!/bin/sh
PYTHON=$(command -v python3) && echo "#!$PYTHON" || echo "#!/usr/bin/python3"
This generates the correct shebang at script creation time. For deployment consistency, standardize on python3 in all environments.

Command Line Expert & Software Engineer
Welcome! I’m Thomas Heinrich, a software engineer and system administrator with a deep passion for the Command Line Interface (CLI). With years of experience navigating the terminal, building backend architectures, and automating server deployments, I created this space to share practical, real-world terminal knowledge.
Whether you are a beginner taking your first steps in a Linux environment or a seasoned DevOps engineer looking to optimize your deployment scripts, you will find actionable solutions here. My goal is to help you ditch the mouse, speed up your workflow, and harness the full power of the command line.