Ein selbstgeschriebenes Python Programm auf dem Raspberry Pi immer mit python programm.py zu starten, ist irgendwie nervig. Zumal andere Python Programme meist ohne das python vornedran auskommen. Wie kann ich also ein selbstgeschriebenes Python Programm ohne das python davor aufrufen?
Anders als bei DOS oder Windows ist es Debian Linux herzlich egal, welches Suffix eine Datei oder ein Programm hat. Ob z.B. ein Python Programm check.py oder check.blah heißt ist wurscht. Damit Linux weiß, was es mit einem Programm tun soll, das gerade aufgerufen wird, schaut es sich den Dateiheader, d.h. die erste Zeile an. Steht da nichts Besonderes, das Linux mitteilt, was eigentlich zu tun ist, gibt’s eine Fehlermeldung und fertig. Mit python vornedran wird der Python Interpreter aufgerufen und die dahinter angegebene Datei abgearbeitet.
Dass Python Programme ein Suffix .py haben, ist reine Konvention und dient nur der Ordnung.
Wie kann ich nun Python Programme aufrufen, ohne python davor zu schreiben?

Dazu dient das sogenannte Shebang, das Linux mitteilt, dass der Python Interpreter aufzurufen ist. Das Shebang wird als allererste Zeile in einem Python Programm geschrieben…
#!/usr/bin/python
…und teilt Linux mit, dass es die aufgerufene Textdatei mit dem in /usr/bin wohnenden Python Interpreter aufrufen soll. Zumindest bei Raspbian liegt er dort. Bei anderen Distributionen kann das auch anderswo sein.
Theoretisch müsste jetzt das Programm checkinet.py durch Eingabe von
checkinet.py
starten. Leider nein! Linux ist für einen Nutzer, der Windows gewohnt ist etwas umständlich aber dafür sehr viel gründlicher: Die Datei muss von den Berechtigungen her noch als „ausführbar“ markiert werden. Das geht so:
chmod +x checkinet.py
oder, für den Fall, dass sich die Datei in einem fremden, für den User Pi nicht so ohne Weiteres beschreibbaren Verzeichnis befindet:
sudo chmod +x checkinet.py
Und, klappt es jetzt? Mitnichten! Warum auch immer, Linux denkt hier m.E. etwas zu kurz und stellt sich blöd: Es muss der Pfad explizit mit angegeben werden. Zumindest in relativer Form als
./checkinet.py
wenn du dich in dem Verzeichnis befindest, in dem das Programm liegt oder absolut als
/home/pi/433mhz/checkinet.py
wenn du dich irgendwo anders im Dateisystem befindest.
Trotzdem klappt dieser Aufruf nicht immer und es hat eine ganze Weile gedauert, bis ich drauf gekommen bin:
Vorsicht, Schreibmaschine!
Solltest du deine Python Programme nicht direkt auf dem Pi editieren (z.B. mit nano), sondern auf einem Windows Rechner, kann es sein, dass der von dir verwendete Editor andere – unsichtbare – Zeilenkommandos in den Programmcode einfügt als bei Linux üblich. Linux verwendet für eine neue Zeile das Zeichen für LF (Linefeed oder ASCII Char10), wohingegen Windows zwei Zeichen dafür einfügt, nämlich CR (Carriage Return oder ASCII Char13) und LF. Linux akzeptiert das zwar beim Aufruf mit dem python Prefix aber leider nicht beim direkten Aufruf. Blöd, is aber so.
Immer wieder erstaunlich, welche Uralt Technologie sich hinter manchen Begriffen versteckt. CR = Carriage Return (Wagenrücklauf) und LF = Line Feed (Zeilenvorschub) sind Begrifflichkeiten aus der Fernschreiber und Schreibmaschinen Ära.
Kopiert man ein in Windows editiertes Programm (z.B. mit WinSCP) auf den Pi und der Editor kann keinen Linux Zeilenvorschub, klappt der direkte Aufruf nicht.
Abhilfe gibt es durch das Programm dos2unix, welches die Windows (=DOS) Zeilenvorschübe auf Linux übersetzt.
Ist es auf dem Pi nicht vorhanden, kann man es durch
sudo apt-get install dos2unix
nachinstallieren. In unserem Fall würden wir mit
dos2unix checkinet.py
das Programm konvertieren und alles läuft wie gewünscht.
Schreibe einen Kommentar zu gr Antwort abbrechen