Als je een Python-script schrijft, schrijf je niet alleen code voor de Python-interpreter; je vertelt ook aan het besturingssysteem hoe die code moet worden uitgevoerd.
Zoals je in dit artikel zult zien, spelen zogeheten shebangs een belangrijke rol in Unix-achtige systemen zoals Linux en macOS.
Je zult zien dat shebangs je in staat stellen een Python-script direct uit te voeren, zonder expliciet python of python3 te typen, zolang het bestand uitvoerrechten heeft. Dit laat scripts meer aanvoelen als native commando's.
Als je net begint met Python, raad ik onze cursus Introduction to Python aan, waarin onderwerpen als datatypes, lijsten, basisfuncties en packages aan bod komen.
Wat is een Python-shebang?
Een shebang is een speciale tekenreeks aan het begin van een script die het besturingssysteem vertelt welke interpreter gebruikt moet worden om de code uit te voeren. Het maakt expliciete aanroepen zoals python script.py overbodig.
De term shebang is afgeleid van een samentrekking van de namen van de twee belangrijkste tekens: het hekje # en het uitroepteken !. Wanneer deze twee tekens de eerste twee bytes van een bestand vormen (#!), functioneren ze als een "magic number": een signatuur die de systeemkernel gebruikt om het bestandstype te herkennen en te bepalen hoe het verwerkt moet worden.
Het primaire doel van een shebang-regel is aan te geven welke interpreter het script moet uitvoeren en hoe dat moet gebeuren. Dit is relevant in de praktijk, omdat systemen vaak meerdere Python-versies geïnstalleerd hebben. Zonder shebang heeft het besturingssysteem geen instructies om het bestand direct uit te voeren. Zo roept #!/usr/bin/env python3 bijvoorbeeld de Python 3-interpreter aan.
De shebang werd eind jaren 70 geïntroduceerd in Unix-achtige systemen om scriptexecutie over shells heen te standaardiseren. In de loop der tijd is deze conventie een standaardonderdeel geworden van Unix-achtige besturingssystemen, waaronder Linux en macOS, en vormt ze nog steeds de basis van shell-scripting en geïnterpreteerde talen zoals Python, Perl en Ruby.
Hoe werkt een Python-shebang?
Laten we bekijken hoe shebangs technisch werken. Wanneer je probeert een script uit te voeren, zoals ./myscript.py, gebeurt het volgende:
De OS-kernel leest de eerste bytes van het bestand. Als het de #! ‘magic number’ ziet, stopt het met proberen het bestand als een binaire executable uit te voeren.
De kernel leest de rest van de eerste regel om het pad naar een interpreter te vinden.
De interpreter leest, parseert en voert vervolgens de Python-code uit.
Je ziet vaak shebangs zoals #!/usr/bin/env python3 in plaats van een direct pad zoals #!/usr/bin/python3. De env-tool zoekt de interpreter op in de PATH-omgevingsvariabele van het systeem in plaats van te vertrouwen op een hardgecodeerde locatie. Deze aanpak maakt scripts draagbaarder, vooral over virtuele omgevingen, containers of systemen waar Python in verschillende mappen kan staan.
In de praktijk nemen shebangs de noodzaak weg om commando's met Python te prefixen en maken ze scripts makkelijker te distribueren en te gebruiken.
Hoewel shebangs een kernfunctie zijn van Unix-achtige systemen, ondersteunt Windows ze niet native op kernelniveau. Moderne Python-installaties zoals de Python Launcher for Windows (py.exe) zijn echter ontworpen om shebang-regels te lezen door Unix-gedrag na te bootsen, waardoor je scripts beter cross-platform compatibel worden.
Python-shebang: syntax en formattering
Een shebang lijkt misschien op een simpele comment, maar volgt strikte regels die door het besturingssysteem zijn gedefinieerd. Het begrijpen van deze structuur is cruciaal om te zorgen dat je scripts betrouwbaar starten in verschillende omgevingen.
De formele structuur en grammatica
Een shebang moet op de allereerste regel van het script staan en beginnen met exact de tekenreeks #!. Daarachter volgt het absolute pad naar de interpreter:
De shebang moet op de allereerste regel van het bestand staan. Zelfs een lege regel of spatie vóór #! zorgt ervoor dat het besturingssysteem de shebang negeert en het bestand als een standaard tekstbestand interpreteert.
De meeste Unix-achtige systemen staan slechts één argument toe, en complexe argumentstrings worden mogelijk niet naar verwachting geparseerd. Zo werkt #!/usr/bin/python3 -v, maar meerdere flags toevoegen kan leiden tot onvoorspelbaar gedrag.
Belangrijk om te weten: de meeste moderne systemen staan een maximale lengte van ongeveer 127 tekens toe op de shebang-regel, inclusief het interpreterpad en eventuele argumenten. In een shebang wordt whitespace letterlijk opgevat, dus onbedoelde spaties, vooral vóór #! of in het interpreterpad, kunnen de uitvoering breken.
Absoluut pad versus op omgeving gebaseerde aanpak
Je kunt de Python-shebang schrijven met een absoluut pad naar de interpreter of een op de omgeving gebaseerde aanpak gebruiken. De onderstaande tabel laat het verschil tussen deze methoden zien:
Kenmerk
Absoluut pad
Op omgeving gebaseerd (env)
Voorbeeld
#!/usr/bin/python3
#!/usr/bin/env python3
Werking
Verwijst naar een hardgecodeerde locatie op de schijf.
Zoekt naar python3 in de mappen die in de PATH van de gebruiker staan.
Portabiliteit
Laag (Python kan in /usr/local/bin of /opt/bin staan).
Hoog, vindt Python waar het ook geïnstalleerd is.
Voorspelbaarheid
Hoog (gebruikt altijd exact de opgegeven binary).
Gemiddeld (gebruikt de eerste Python die in het pad wordt gevonden).
Moderne development geeft de voorkeur aan #!/usr/bin/env python3 en raadt dit dus aan. De Python Enhancement Proposal 394 (PEP 394), die de naamgeving van Python-commando's begeleidt, adviseert om in shebangs expliciet python3 te gebruiken om ambiguïteit te voorkomen en te garanderen dat het script met Python 3 draait in plaats van met een legacy Python 2-interpreter.
Bestandsextensies en shebangs
Bestandsextensies spelen een ondergeschikte rol bij scriptexecutie vergeleken met shebangs. Op Unix-achtige systemen heeft een script geen .py-extensie nodig om te draaien. Als het bestand uitvoerrechten en een geldige shebang heeft, kun je het direct uitvoeren zoals elk ander commando.
Op Windows zijn bestandsextensies belangrijker, omdat de .py-extensie het besturingssysteem helpt het bestand te koppelen aan de Python-interpreter. In de praktijk verbetert het gebruik van een .py-extensie de duidelijkheid en cross-platform compatibiliteit. Gebruik tijdens development bij voorkeur script.py als naam en verwijder de extensie bij deployment om ervoor te zorgen dat scripts betrouwbaar in verschillende omgevingen werken.
Shebangs maken en gebruiken in Python-scripts
Nu je begrijpt hoe shebangs werken, kijken we hoe je ze inzet als uitvoerbare commando's.
Stapsgewijze implementatie
Volg onderstaande stappen om een Python-script met een shebang te maken en uit te voeren:
Maak een nieuw bestand en zet de shebang op de allereerste regel. Schrijf onder de shebang je normale Python-code. Sla het bestand op met een optionele .py-extensie op Unix-achtige systemen.
#!/usr/bin/env python3print("This is the churn trends for 2025.")Mogelijk gemaakt door
Op Unix-achtige systemen worden bestanden standaard zonder uitvoerrechten aangemaakt. Je moet dus rechten geven met het chmod-commando (change mode) in je terminal:
Als je het script overal wilt kunnen draaien zonder het pad te typen, verplaats het dan naar een map die al in je $PATH staat, zoals /usr/local/bin, of voeg de map van je script toe aan de PATH:
# Moving the script to a global bin foldersudomv churn_trends /usr/local/bin/churn_trendsMogelijk gemaakt door
Shebangs combineren met de name-main-idioom
Met een shebang is het de bedoeling dat het bestand als script wordt uitgevoerd. Python-bestanden worden echter ook vaak als modules geïmporteerd in andere scripts. Om te voorkomen dat je scriptlogica automatisch draait bij een import, gebruik je het "name-main"-idioom.
De variabele __name__ is een speciale ingebouwde variabele waarbij:
Als je het script direct draait, zoals ./script.py, zet Python __name__ op "__main__".
Als je het script importeert met import script, zet Python __name__ op de bestandsnaam.
Je kunt de shebang met dit idioom combineren om een bestand te maken dat zowel een tool als een bibliotheek is. In het onderstaande voorbeeld maakt het script, wanneer je het direct draait, een kleine DataFrame, roept de functie aan en print het resultaat. Wanneer je het script importeert, is alleen de functie beschikbaar zonder de scriptlogica uit te voeren.
#!/usr/bin/env python3
def analyze_data(df):
"""Reusable functionfor data processing."""
return df.describe()if __name__ =="__main__":import pandas as pd
df= pd.DataFrame({'x':[1, 2, 3]})
print(analyze_data(df))# Runs as scriptMogelijk gemaakt door
Best practices voor Python-shebangs
Om ervoor te zorgen dat je shebang-scripts betrouwbaar draaien op verschillende systemen en in verschillende deployment-scenario's, raad ik de volgende best practices aan:
De Python-versie specificeren
Python 2 en Python 3 verschillen aanzienlijk in syntax, standaardbibliotheken en standaardgedrag. Aangezien Python 2 end-of-life is, moeten moderne scripts expliciet Python 3 targeten om ambiguïteit en onverwachte runtimeproblemen te voorkomen.
In shebangs kunnen python, python2 en python3 naar verschillende interpreters wijzen, afhankelijk van het systeem. Op sommige systemen kan python nog naar Python 2 verwijzen, terwijl het op andere systemen niet bestaat. Volg de aanbeveling uit PEP 394 en gebruik in shebangs altijd python3 voor user-facing scripts, zodat de bedoelde versie expliciet is.
Virtuele omgevingen (venv, conda) isoleren projectafhankelijkheden en leveren vaak hun eigen Python-interpreter. Wanneer een virtuele omgeving is geactiveerd, wijzigt je shell de PATH. Als #!/usr/bin/env python3 de PATH doorzoekt, vindt het automatisch de Python-binary binnen je virtuele omgeving in plaats van de systeemversie.
Tools zoals pyenv en andere managers voor interpreters werken vergelijkbaar door PATH te manipuleren. Dit maakt op omgeving gebaseerde shebangs bijzonder effectief, zodat je wereldwijd of per map tussen Python-versies kunt wisselen zonder de code van het script aan te passen.
Ik raad je aan onze Conda Cheat Sheet te gebruiken als je in één oogopslag packages wilt beheren en met de conda-omgeving wilt werken.
Portabiliteit maximaliseren over systemen en omgevingen
Volg deze best practices om draagbare shebangs te schrijven:
Geef de voorkeur aan de op omgeving gebaseerde aanpak #!/usr/bin/env python3 boven absolute interpreterpaden.
Houd de shebang kort en eenvoudig.
Documenteer duidelijk de vereiste Python-versie en dependencies.
Gebruik UTF-8-codering en vermijd platformspecifieke aannames.
Je kunt duidelijke shebangs altijd combineren met .py-extensies voor cross-platform compatibiliteit.
Veelvoorkomende valkuilen en antipatterns vermijden
Let op de volgende veelvoorkomende fouten bij het schrijven van draagbare shebangs:
Plaats de shebang #! altijd op de eerste regel, zonder spaties tussen #! en het pad.
Overschrijd de tekenlimieten van het systeem niet. Linux heeft een limiet van 127 bytes en macOS een limiet van 256 bytes.
Wees voorzichtig bij de keuze tussen absolute paden en env, want hardcoderen van interpreterpaden kan risicovol zijn in gevoelige omgevingen.
Shebangs bij packaging en distributie
Bij het packagen van Python-applicaties kunnen tools zoals pip, setuptools en pipx tijdens de installatie shebang-regels herschrijven zodat ze naar de juiste interpreter verwijzen.
Als je bijvoorbeeld pip install your-package uitvoert, genereert de installer automatisch een shebang-regel die naar de exacte Python-interpreter verwijst die voor de installatie is gebruikt. Definieer je entry points daarom altijd in setup.py of pyproject.toml in plaats van uitsluitend te vertrouwen op handmatige shebangs voor gedistribueerde apps.
Windows-compatibiliteit en workarounds
Windows ondersteunt shebangs niet native op het niveau van het besturingssysteem. De Python Launcher py.exe kan shebang-regels echter wel lezen en de juiste interpreter selecteren. Hoewel deze tool meestal met Python op Windows wordt geïnstalleerd, moet je altijd controleren of hij aanwezig is voordat je shebang-scripts draait.
Je kunt je scripts ook uitvoeren via Windows Subsystem for Linux (WSL) of vertrouwen op registergebaseerde bestandsassociaties.
Omgevingsspecifieke beperkingen en limieten
Verschillende besturingssystemen behandelen shebang-argumenten anders. Linux behandelt doorgaans alles na de eerste spatie als één argument, terwijl macOS/FreeBSD mogelijk meerdere argumenten anders verwerken.
Hanteer als vuistregel: gebruik nooit meer dan één argument in de shebang en laat het script de rest van de complexe runtimeconfiguratie afhandelen.
Problemen met tekencodering en regeleinden
Gebruik voor consistentie een compatibele codering, meestal UTF-8 zonder BOM, en zorg dat de shebang de eerste bytes van het bestand zijn.
Let op dat Windows \r\n (CRLF) gebruikt voor regeleinden, terwijl Unix \n (LF) gebruikt. Als je een script op Windows met CRLF opslaat en het op Linux probeert te draaien, zal de kernel denken dat het interpreterpad python3\r is, wat niet bestaat. Stel daarom je code-editor altijd in op LF (Unix) regeleinden voor Python-scripts.
Moderne benaderingen voor Python-shebangs
Moderne Python-ontwikkeling biedt alternatieven voor shebang-scripting die uitvoering, packaging en distributie vereenvoudigen. De volgende methoden verminderen het handmatig beheren van interpreters en bieden betere compatibiliteit over verschillende besturingssystemen.
Console-scripts en entry points in setuptools
Console-scripts zijn een packagingfunctie waarmee je commandoregelcommando's kunt definiëren in je projectconfiguratie. Je kunt ze bijvoorbeeld definiëren in setup.py of pyproject.toml. Hiermee kun je een entry point declareren dat een commandonaam aan een Python-functie koppelt.
Wanneer het package wordt geïnstalleerd, genereert de installer automatisch een kleine launcher die geschikt is voor het besturingssysteem. Dit script bevat de juiste verwijzing naar de interpreter en handelt de uitvoering transparant af.
Entry points vereenvoudigen dus de distributie van scripts door het handmatig beheren van shebangs overbodig te maken, zorgen dat de juiste Python-interpreter wordt gebruikt en bieden consistent gedrag over platformen heen
De __main__.py-moduleaanpak
Zoals we eerder zagen, kun je met het bestand __main__.py een heel package als programma uitvoeren met de syntax python -m package_name. Wanneer Python een package met een __main__.py-bestand ziet, behandelt het dat bestand als het entry point van het package.
Deze aanpak maakt het mogelijk je app te distribueren als een .zip-bestand of een "Python Zip Application" met de module zipapp. Het houdt de uitvoerlogica centraal, voorkomt dat overal in het project uitvoerbare scripts rondzwerven en maakt het eenvoudiger een nette packagestructuur te onderhouden.
PEP 723 en inline scriptmetadata
PEP 723 introduceert een gestandaardiseerde manier om inline metadata direct in Python-scripts op te nemen. Deze metadata kan dependencies, vereisten voor de Python-versie en andere uitvoerdetails in een machineleesbaar formaat beschrijven.
Het doel van PEP 723 is om standalone scripts eenvoudiger uit te voeren, te delen en te beheren—vooral met moderne tools die de metadata kunnen lezen en automatisch de vereiste omgeving kunnen opzetten.
Speciale aandachtspunten bij Python-shebangs
De volgende punten zijn geavanceerde overwegingen die relevant zijn voor gedistribueerde tools, gedeelde systemen en cross-platform applicaties.
Vervanging van shebangs door buildsystemen en installatietools
Buildtools zoals setuptools, flit of poetry controleren je scripts tijdens het installatieproces. Als een script via pip wordt geïnstalleerd, vervangt de installer je generieke #!/usr/bin/env python3 door het absolute pad naar de specifieke Python-interpreter die voor die installatie is gebruikt.
Deze herschrijving zorgt ervoor dat het script "vergrendeld" is aan de omgeving waarin het is geïnstalleerd, zodat het niet per ongeluk draait met een andere Python-versie die de vereiste dependencies mist.
Aangepaste interpreters en domeinspecifieke talen gebruiken
De shebang is niet beperkt tot standaard Python-binaries. Ze kan naar elke executable verwijzen die een tekstbestand kan verwerken. Als je PyPy gebruikt voor performance of Jython voor Java-integratie, zal je shebang dat weerspiegelen: #!/usr/bin/env pypy3.
In data science of DevOps kun je shebangs zien die verwijzen naar aangepaste engines die Python-achtige domeinspecifieke talen (DSL's) interpreteren, zodat het bestand kan fungeren als een gespecialiseerde configuratie- of taakdefinitie.
Ik raad je aan onze Python for Data Science Cheat Sheet te downloaden als je op zoek bent naar een snelle gids om met Python te werken voor makkelijker leren.
Beveiligingsoverwegingen bij shebangs
In multi-user-omgevingen kunnen shebangs veiligheidsrisico's introduceren als ze niet zorgvuldig worden gebruikt. Het gebruik van het relatieve pad #!/usr/bin/env vertrouwt bijvoorbeeld op de PATH van de gebruiker, die gemanipuleerd kan worden om naar een kwaadaardige interpreter te wijzen.
Om dergelijke risico's te beperken:
Gebruik absolute interpreterpaden in veiligheidsgevoelige contexten.
Beperk schrijfrechten op uitvoerbare scripts.
Voer geen scripts uit vanuit onbetrouwbare mappen.
Evalueer de PATH-configuratie in omgevingen met verhoogde rechten.
Impact van shebangs op cross-platform scripting
Shebangs werken native op Unix-achtige systemen maar hebben beperkte native ondersteuning op Windows. Dit kan de portabiliteit beïnvloeden wanneer scripts tussen besturingssystemen worden gedeeld.
Voor consistent gedrag over platformen heen:
Combineer shebangs met packaging-entry points voor CLI-tools.
Gebruik env voor flexibiliteit.
Gebruik de py-launcher op Windows, die Unix-stijl shebangs respecteert.
Conclusie
Shebangs spelen een belangrijke rol bij de uitvoering van Python-scripts: ze overbruggen de kloof tussen je code en het besturingssysteem. Correct gebruikt maken ze directe uitvoering mogelijk, zorgen ze voor duidelijke interpreterselectie en leveren ze draagbare, gebruiksvriendelijke scripts.
Als volgende stap kun je experimenteren met packaging-workflows, PEP's over scriptexecutie verkennen of bijdragen aan gedeelde tooling en documentatie. Door je begrip van de uitvoering van Python-scripts te verdiepen, schrijf je schonere en betere code.
Technical writer voor data science met praktische ervaring in data-analyse, business intelligence en data science. Ik schrijf praktische, op de industrie gerichte content over SQL, Python, Power BI, Databricks en data engineering, gebaseerd op analytisch werk in de echte wereld. Mijn schrijfwerk slaat een brug tussen technische diepgang en zakelijke impact, en helpt professionals om data om te zetten in onderbouwde beslissingen.
\n
\n
\n
\n
Python-shebang: veelgestelde vragen
Hoe zorg ik dat mijn shebang-regel draagbaar is op verschillende systemen?⌄
Gebruik #!/usr/bin/env python3 zodat de interpreter via de systeem-PATH wordt gevonden, en vermijd hardgecodeerde paden of extra argumenten.
Wat zijn best practices voor het gebruik van shebang-regels in Python-scripts?⌄
Zet de shebang op de eerste regel, target expliciet Python 3, houd hem kort en combineer hem met de juiste bestandsrechten en documentatie.
Hoe werkt de shebang-regel samen met virtuele omgevingen?⌄
Wanneer een virtuele omgeving is geactiveerd, resolveert env naar de Python-interpreter van die omgeving, zodat het script met de juiste dependencies draait.
Kan ik een shebang-regel gebruiken met een aangepaste Python-interpreter?⌄
Ja, je kunt de shebang laten wijzen naar een aangepaste interpreter of runtime, via een absoluut pad of via env als die in PATH staat.
Wat zijn de beveiligingsimplicaties van het gebruik van shebang-regels?⌄
Het gebruik van env is afhankelijk van PATH, wat riskant kan zijn in gedeelde omgevingen. Geef in gevoelige scripts de voorkeur aan vaste interpreterpaden en strikte bestandsrechten.
Als je een Python-script schrijft, schrijf je niet alleen code voor de Python-interpreter; je vertelt ook aan het besturingssysteem hoe die code moet worden uitgevoerd.
Zoals je in dit artikel zult zien, spelen zogeheten shebangs een belangrijke rol in Unix-achtige systemen zoals Linux en macOS.
Je zult zien dat shebangs je in staat stellen een Python-script direct uit te voeren, zonder expliciet
pythonofpython3te typen, zolang het bestand uitvoerrechten heeft. Dit laat scripts meer aanvoelen als native commando's.Als je net begint met Python, raad ik onze cursus Introduction to Python aan, waarin onderwerpen als datatypes, lijsten, basisfuncties en packages aan bod komen.
Wat is een Python-shebang?
Een shebang is een speciale tekenreeks aan het begin van een script die het besturingssysteem vertelt welke interpreter gebruikt moet worden om de code uit te voeren. Het maakt expliciete aanroepen zoals
python script.pyoverbodig.De term shebang is afgeleid van een samentrekking van de namen van de twee belangrijkste tekens: het hekje
#en het uitroepteken!. Wanneer deze twee tekens de eerste twee bytes van een bestand vormen (#!), functioneren ze als een "magic number": een signatuur die de systeemkernel gebruikt om het bestandstype te herkennen en te bepalen hoe het verwerkt moet worden.Het primaire doel van een shebang-regel is aan te geven welke interpreter het script moet uitvoeren en hoe dat moet gebeuren. Dit is relevant in de praktijk, omdat systemen vaak meerdere Python-versies geïnstalleerd hebben. Zonder shebang heeft het besturingssysteem geen instructies om het bestand direct uit te voeren. Zo roept
#!/usr/bin/env python3bijvoorbeeld de Python 3-interpreter aan.De shebang werd eind jaren 70 geïntroduceerd in Unix-achtige systemen om scriptexecutie over shells heen te standaardiseren. In de loop der tijd is deze conventie een standaardonderdeel geworden van Unix-achtige besturingssystemen, waaronder Linux en macOS, en vormt ze nog steeds de basis van shell-scripting en geïnterpreteerde talen zoals Python, Perl en Ruby.
Hoe werkt een Python-shebang?
Laten we bekijken hoe shebangs technisch werken. Wanneer je probeert een script uit te voeren, zoals
./myscript.py, gebeurt het volgende:De OS-kernel leest de eerste bytes van het bestand. Als het de
#!‘magic number’ ziet, stopt het met proberen het bestand als een binaire executable uit te voeren.De kernel leest de rest van de eerste regel om het pad naar een interpreter te vinden.
De interpreter leest, parseert en voert vervolgens de Python-code uit.
Je ziet vaak shebangs zoals
#!/usr/bin/env python3in plaats van een direct pad zoals#!/usr/bin/python3. Deenv-tool zoekt de interpreter op in dePATH-omgevingsvariabele van het systeem in plaats van te vertrouwen op een hardgecodeerde locatie. Deze aanpak maakt scripts draagbaarder, vooral over virtuele omgevingen, containers of systemen waar Python in verschillende mappen kan staan.In de praktijk nemen shebangs de noodzaak weg om commando's met Python te prefixen en maken ze scripts makkelijker te distribueren en te gebruiken.
Hoewel shebangs een kernfunctie zijn van Unix-achtige systemen, ondersteunt Windows ze niet native op kernelniveau. Moderne Python-installaties zoals de Python Launcher for Windows (
py.exe) zijn echter ontworpen om shebang-regels te lezen door Unix-gedrag na te bootsen, waardoor je scripts beter cross-platform compatibel worden.Python-shebang: syntax en formattering
Een shebang lijkt misschien op een simpele comment, maar volgt strikte regels die door het besturingssysteem zijn gedefinieerd. Het begrijpen van deze structuur is cruciaal om te zorgen dat je scripts betrouwbaar starten in verschillende omgevingen.
De formele structuur en grammatica
Een shebang moet op de allereerste regel van het script staan en beginnen met exact de tekenreeks
#!. Daarachter volgt het absolute pad naar de interpreter:De shebang moet op de allereerste regel van het bestand staan. Zelfs een lege regel of spatie vóór
#!zorgt ervoor dat het besturingssysteem de shebang negeert en het bestand als een standaard tekstbestand interpreteert.De meeste Unix-achtige systemen staan slechts één argument toe, en complexe argumentstrings worden mogelijk niet naar verwachting geparseerd. Zo werkt
#!/usr/bin/python3 -v, maar meerdere flags toevoegen kan leiden tot onvoorspelbaar gedrag.Belangrijk om te weten: de meeste moderne systemen staan een maximale lengte van ongeveer 127 tekens toe op de shebang-regel, inclusief het interpreterpad en eventuele argumenten. In een shebang wordt whitespace letterlijk opgevat, dus onbedoelde spaties, vooral vóór
#!of in het interpreterpad, kunnen de uitvoering breken.Absoluut pad versus op omgeving gebaseerde aanpak
Je kunt de Python-shebang schrijven met een absoluut pad naar de interpreter of een op de omgeving gebaseerde aanpak gebruiken. De onderstaande tabel laat het verschil tussen deze methoden zien:
Kenmerk
Absoluut pad
Op omgeving gebaseerd (env)
Voorbeeld
#!/usr/bin/python3#!/usr/bin/env python3Werking
Verwijst naar een hardgecodeerde locatie op de schijf.
Zoekt naar
python3in de mappen die in dePATHvan de gebruiker staan.Portabiliteit
Laag (Python kan in
/usr/local/binof/opt/binstaan).Hoog, vindt Python waar het ook geïnstalleerd is.
Voorspelbaarheid
Hoog (gebruikt altijd exact de opgegeven binary).
Gemiddeld (gebruikt de eerste Python die in het pad wordt gevonden).
Moderne development geeft de voorkeur aan
#!/usr/bin/env python3en raadt dit dus aan. De Python Enhancement Proposal 394 (PEP 394), die de naamgeving van Python-commando's begeleidt, adviseert om in shebangs expliciet python3 te gebruiken om ambiguïteit te voorkomen en te garanderen dat het script met Python 3 draait in plaats van met een legacy Python 2-interpreter.Bestandsextensies en shebangs
Bestandsextensies spelen een ondergeschikte rol bij scriptexecutie vergeleken met shebangs. Op Unix-achtige systemen heeft een script geen
.py-extensie nodig om te draaien. Als het bestand uitvoerrechten en een geldige shebang heeft, kun je het direct uitvoeren zoals elk ander commando.Op Windows zijn bestandsextensies belangrijker, omdat de
.py-extensie het besturingssysteem helpt het bestand te koppelen aan de Python-interpreter. In de praktijk verbetert het gebruik van een.py-extensie de duidelijkheid en cross-platform compatibiliteit. Gebruik tijdens development bij voorkeurscript.pyals naam en verwijder de extensie bij deployment om ervoor te zorgen dat scripts betrouwbaar in verschillende omgevingen werken.Shebangs maken en gebruiken in Python-scripts
Nu je begrijpt hoe shebangs werken, kijken we hoe je ze inzet als uitvoerbare commando's.
Stapsgewijze implementatie
Volg onderstaande stappen om een Python-script met een shebang te maken en uit te voeren:
Maak een nieuw bestand en zet de shebang op de allereerste regel. Schrijf onder de shebang je normale Python-code. Sla het bestand op met een optionele
.py-extensie op Unix-achtige systemen.Op Unix-achtige systemen worden bestanden standaard zonder uitvoerrechten aangemaakt. Je moet dus rechten geven met het
chmod-commando (change mode) in je terminal:Voer het script uit door naar het pad te verwijzen.
Als je het script overal wilt kunnen draaien zonder het pad te typen, verplaats het dan naar een map die al in je
$PATHstaat, zoals/usr/local/bin, of voeg de map van je script toe aan de PATH:Shebangs combineren met de name-main-idioom
Met een shebang is het de bedoeling dat het bestand als script wordt uitgevoerd. Python-bestanden worden echter ook vaak als modules geïmporteerd in andere scripts. Om te voorkomen dat je scriptlogica automatisch draait bij een import, gebruik je het "name-main"-idioom.
De variabele
__name__is een speciale ingebouwde variabele waarbij:Als je het script direct draait, zoals
./script.py, zet Python__name__op"__main__".Als je het script importeert met
import script, zet Python__name__op de bestandsnaam.Je kunt de shebang met dit idioom combineren om een bestand te maken dat zowel een tool als een bibliotheek is. In het onderstaande voorbeeld maakt het script, wanneer je het direct draait, een kleine DataFrame, roept de functie aan en print het resultaat. Wanneer je het script importeert, is alleen de functie beschikbaar zonder de scriptlogica uit te voeren.
Best practices voor Python-shebangs
Om ervoor te zorgen dat je shebang-scripts betrouwbaar draaien op verschillende systemen en in verschillende deployment-scenario's, raad ik de volgende best practices aan:
De Python-versie specificeren
Python 2 en Python 3 verschillen aanzienlijk in syntax, standaardbibliotheken en standaardgedrag. Aangezien Python 2 end-of-life is, moeten moderne scripts expliciet Python 3 targeten om ambiguïteit en onverwachte runtimeproblemen te voorkomen.
In shebangs kunnen
python,python2enpython3naar verschillende interpreters wijzen, afhankelijk van het systeem. Op sommige systemen kanpythonnog naar Python 2 verwijzen, terwijl het op andere systemen niet bestaat. Volg de aanbeveling uit PEP 394 en gebruik in shebangs altijdpython3voor user-facing scripts, zodat de bedoelde versie expliciet is.Speciale aandachtspunten voor virtuele omgevingen
Virtuele omgevingen (
venv,conda) isoleren projectafhankelijkheden en leveren vaak hun eigen Python-interpreter. Wanneer een virtuele omgeving is geactiveerd, wijzigt je shell dePATH. Als#!/usr/bin/env python3dePATHdoorzoekt, vindt het automatisch de Python-binary binnen je virtuele omgeving in plaats van de systeemversie.Tools zoals
pyenven andere managers voor interpreters werken vergelijkbaar doorPATHte manipuleren. Dit maakt op omgeving gebaseerde shebangs bijzonder effectief, zodat je wereldwijd of per map tussen Python-versies kunt wisselen zonder de code van het script aan te passen.Ik raad je aan onze Conda Cheat Sheet te gebruiken als je in één oogopslag packages wilt beheren en met de conda-omgeving wilt werken.
Portabiliteit maximaliseren over systemen en omgevingen
Volg deze best practices om draagbare shebangs te schrijven:
Geef de voorkeur aan de op omgeving gebaseerde aanpak
#!/usr/bin/env python3boven absolute interpreterpaden.Houd de shebang kort en eenvoudig.
Documenteer duidelijk de vereiste Python-versie en dependencies.
Gebruik UTF-8-codering en vermijd platformspecifieke aannames.
Je kunt duidelijke shebangs altijd combineren met
.py-extensies voor cross-platform compatibiliteit.Veelvoorkomende valkuilen en antipatterns vermijden
Let op de volgende veelvoorkomende fouten bij het schrijven van draagbare shebangs:
Plaats de shebang
#!altijd op de eerste regel, zonder spaties tussen#!en het pad.Overschrijd de tekenlimieten van het systeem niet. Linux heeft een limiet van 127 bytes en macOS een limiet van 256 bytes.
Wees voorzichtig bij de keuze tussen absolute paden en
env, want hardcoderen van interpreterpaden kan risicovol zijn in gevoelige omgevingen.Shebangs bij packaging en distributie
Bij het packagen van Python-applicaties kunnen tools zoals
pip,setuptoolsenpipxtijdens de installatie shebang-regels herschrijven zodat ze naar de juiste interpreter verwijzen.Als je bijvoorbeeld
pip install your-packageuitvoert, genereert de installer automatisch een shebang-regel die naar de exacte Python-interpreter verwijst die voor de installatie is gebruikt. Definieer je entry points daarom altijd insetup.pyofpyproject.tomlin plaats van uitsluitend te vertrouwen op handmatige shebangs voor gedistribueerde apps.Windows-compatibiliteit en workarounds
Windows ondersteunt shebangs niet native op het niveau van het besturingssysteem. De Python Launcher
py.exekan shebang-regels echter wel lezen en de juiste interpreter selecteren. Hoewel deze tool meestal met Python op Windows wordt geïnstalleerd, moet je altijd controleren of hij aanwezig is voordat je shebang-scripts draait.Je kunt je scripts ook uitvoeren via Windows Subsystem for Linux (WSL) of vertrouwen op registergebaseerde bestandsassociaties.
Omgevingsspecifieke beperkingen en limieten
Verschillende besturingssystemen behandelen shebang-argumenten anders. Linux behandelt doorgaans alles na de eerste spatie als één argument, terwijl macOS/FreeBSD mogelijk meerdere argumenten anders verwerken.
Hanteer als vuistregel: gebruik nooit meer dan één argument in de shebang en laat het script de rest van de complexe runtimeconfiguratie afhandelen.
Problemen met tekencodering en regeleinden
Gebruik voor consistentie een compatibele codering, meestal UTF-8 zonder BOM, en zorg dat de shebang de eerste bytes van het bestand zijn.
Let op dat Windows
\r\n(CRLF) gebruikt voor regeleinden, terwijl Unix\n(LF) gebruikt. Als je een script op Windows met CRLF opslaat en het op Linux probeert te draaien, zal de kernel denken dat het interpreterpadpython3\ris, wat niet bestaat. Stel daarom je code-editor altijd in op LF (Unix) regeleinden voor Python-scripts.Moderne benaderingen voor Python-shebangs
Moderne Python-ontwikkeling biedt alternatieven voor shebang-scripting die uitvoering, packaging en distributie vereenvoudigen. De volgende methoden verminderen het handmatig beheren van interpreters en bieden betere compatibiliteit over verschillende besturingssystemen.
Console-scripts en entry points in setuptools
Console-scripts zijn een packagingfunctie waarmee je commandoregelcommando's kunt definiëren in je projectconfiguratie. Je kunt ze bijvoorbeeld definiëren in
setup.pyofpyproject.toml. Hiermee kun je een entry point declareren dat een commandonaam aan een Python-functie koppelt.Wanneer het package wordt geïnstalleerd, genereert de installer automatisch een kleine launcher die geschikt is voor het besturingssysteem. Dit script bevat de juiste verwijzing naar de interpreter en handelt de uitvoering transparant af.
Entry points vereenvoudigen dus de distributie van scripts door het handmatig beheren van shebangs overbodig te maken, zorgen dat de juiste Python-interpreter wordt gebruikt en bieden consistent gedrag over platformen heen
De __main__.py-moduleaanpak
Zoals we eerder zagen, kun je met het bestand
__main__.pyeen heel package als programma uitvoeren met de syntaxpython -m package_name. Wanneer Python een package met een__main__.py-bestand ziet, behandelt het dat bestand als het entry point van het package.Deze aanpak maakt het mogelijk je app te distribueren als een
.zip-bestand of een "Python Zip Application" met de modulezipapp. Het houdt de uitvoerlogica centraal, voorkomt dat overal in het project uitvoerbare scripts rondzwerven en maakt het eenvoudiger een nette packagestructuur te onderhouden.PEP 723 en inline scriptmetadata
PEP 723 introduceert een gestandaardiseerde manier om inline metadata direct in Python-scripts op te nemen. Deze metadata kan dependencies, vereisten voor de Python-versie en andere uitvoerdetails in een machineleesbaar formaat beschrijven.
Het doel van PEP 723 is om standalone scripts eenvoudiger uit te voeren, te delen en te beheren—vooral met moderne tools die de metadata kunnen lezen en automatisch de vereiste omgeving kunnen opzetten.
Speciale aandachtspunten bij Python-shebangs
De volgende punten zijn geavanceerde overwegingen die relevant zijn voor gedistribueerde tools, gedeelde systemen en cross-platform applicaties.
Vervanging van shebangs door buildsystemen en installatietools
Buildtools zoals
setuptools,flitofpoetrycontroleren je scripts tijdens het installatieproces. Als een script viapipwordt geïnstalleerd, vervangt de installer je generieke#!/usr/bin/env python3door het absolute pad naar de specifieke Python-interpreter die voor die installatie is gebruikt.Deze herschrijving zorgt ervoor dat het script "vergrendeld" is aan de omgeving waarin het is geïnstalleerd, zodat het niet per ongeluk draait met een andere Python-versie die de vereiste dependencies mist.
Aangepaste interpreters en domeinspecifieke talen gebruiken
De shebang is niet beperkt tot standaard Python-binaries. Ze kan naar elke executable verwijzen die een tekstbestand kan verwerken. Als je PyPy gebruikt voor performance of Jython voor Java-integratie, zal je shebang dat weerspiegelen:
#!/usr/bin/env pypy3.In data science of DevOps kun je shebangs zien die verwijzen naar aangepaste engines die Python-achtige domeinspecifieke talen (DSL's) interpreteren, zodat het bestand kan fungeren als een gespecialiseerde configuratie- of taakdefinitie.
Ik raad je aan onze Python for Data Science Cheat Sheet te downloaden als je op zoek bent naar een snelle gids om met Python te werken voor makkelijker leren.
Beveiligingsoverwegingen bij shebangs
In multi-user-omgevingen kunnen shebangs veiligheidsrisico's introduceren als ze niet zorgvuldig worden gebruikt. Het gebruik van het relatieve pad
#!/usr/bin/envvertrouwt bijvoorbeeld op dePATHvan de gebruiker, die gemanipuleerd kan worden om naar een kwaadaardige interpreter te wijzen.Om dergelijke risico's te beperken:
Gebruik absolute interpreterpaden in veiligheidsgevoelige contexten.
Beperk schrijfrechten op uitvoerbare scripts.
Voer geen scripts uit vanuit onbetrouwbare mappen.
Evalueer de
PATH-configuratie in omgevingen met verhoogde rechten.Impact van shebangs op cross-platform scripting
Shebangs werken native op Unix-achtige systemen maar hebben beperkte native ondersteuning op Windows. Dit kan de portabiliteit beïnvloeden wanneer scripts tussen besturingssystemen worden gedeeld.
Voor consistent gedrag over platformen heen:
Combineer shebangs met packaging-entry points voor CLI-tools.
Gebruik
envvoor flexibiliteit.Gebruik de
py-launcher op Windows, die Unix-stijl shebangs respecteert.Conclusie
Shebangs spelen een belangrijke rol bij de uitvoering van Python-scripts: ze overbruggen de kloof tussen je code en het besturingssysteem. Correct gebruikt maken ze directe uitvoering mogelijk, zorgen ze voor duidelijke interpreterselectie en leveren ze draagbare, gebruiksvriendelijke scripts.
Als volgende stap kun je experimenteren met packaging-workflows, PEP's over scriptexecutie verkennen of bijdragen aan gedeelde tooling en documentatie. Door je begrip van de uitvoering van Python-scripts te verdiepen, schrijf je schonere en betere code.
Je kunt meer leren via onze skill tracks Python Data Fundamentals en Python Programming Fundamentals. Tot slot raad ik persoonlijk onze Python Developer-carrièretrack aan om te leren over testen van code en versiebeheer bij webscraping en het ontwikkelen van packages.