{"id":117,"date":"2014-07-03T20:25:42","date_gmt":"2014-07-03T18:25:42","guid":{"rendered":"http:\/\/chriskrz.selfhost.bz\/?p=117"},"modified":"2021-02-17T15:39:19","modified_gmt":"2021-02-17T14:39:19","slug":"shebang-oder-wie-man-python-weglaesst","status":"publish","type":"post","link":"https:\/\/www.rustimation.eu\/index.php\/shebang-oder-wie-man-python-weglaesst\/","title":{"rendered":"Shebang! Oder wie man Python wegl\u00e4sst"},"content":{"rendered":"<p>Ein selbstgeschriebenes Python Programm auf dem Raspberry Pi immer mit <code>python programm.py<\/code> 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 <code>python<\/code> davor aufrufen?<!--more--><\/p>\n<p>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 <code>check.py<\/code> oder <code>check.blah<\/code> hei\u00dft ist wurscht. Damit Linux wei\u00df, 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 <code>python<\/code> vornedran wird der Python Interpreter aufgerufen und die dahinter angegebene Datei abgearbeitet.<\/p>\n<p>Dass Python Programme ein Suffix <code>.py<\/code> haben, ist reine Konvention und dient nur der Ordnung.<\/p>\n<h6>Wie kann ich nun Python Programme aufrufen, ohne python davor zu schreiben?<\/h6>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-871 aligncenter\" src=\"https:\/\/www.rustimation.eu\/wordpress\/wp-content\/uploads\/2017\/09\/shebang.png\" alt=\"\" width=\"95\" height=\"95\" \/><\/p>\n<p>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&#8230;<\/p>\n<pre class=\"lang:python decode:1 inline:1 \">#!\/usr\/bin\/python<\/pre>\n<p>&#8230;und teilt Linux mit, dass es die aufgerufene Textdatei mit dem in <code>\/usr\/bin<\/code> wohnenden Python Interpreter aufrufen soll. Zumindest bei Raspbian liegt er dort. Bei anderen Distributionen kann das auch anderswo sein.<\/p>\n<p>Theoretisch m\u00fcsste jetzt das Programm <code>checkinet.py<\/code> durch Eingabe von<\/p>\n<pre class=\"lang:python decode:1 inline:1 \">checkinet.py<\/pre>\n<p>starten. Leider nein! Linux ist f\u00fcr einen Nutzer, der Windows gewohnt ist etwas umst\u00e4ndlich aber daf\u00fcr sehr viel gr\u00fcndlicher: Die Datei muss von den Berechtigungen her noch als \"ausf\u00fchrbar\" markiert werden. Das geht so:<\/p>\n<pre class=\"lang:python decode:1 inline:1 \">chmod +x checkinet.py<\/pre>\n<p>oder, f\u00fcr den Fall, dass sich die Datei in einem fremden, f\u00fcr den User Pi nicht so ohne Weiteres beschreibbaren Verzeichnis befindet:<\/p>\n<pre class=\"lang:python decode:true\">sudo chmod +x checkinet.py<\/pre>\n<p>Und, klappt es jetzt? Mitnichten! Warum auch immer, Linux denkt hier\u00a0 m.E. etwas zu kurz und stellt sich bl\u00f6d: Es muss der Pfad explizit mit angegeben werden. Zumindest in relativer Form als<\/p>\n<pre class=\"lang:python decode:1 inline:1 \">.\/checkinet.py<\/pre>\n<p>wenn du dich in dem Verzeichnis befindest, in dem das Programm liegt oder absolut als<\/p>\n<pre class=\"lang:python decode:1 inline:1 \">\/home\/pi\/433mhz\/checkinet.py<\/pre>\n<p>wenn du dich irgendwo anders im Dateisystem befindest.<\/p>\n<p>Trotzdem klappt dieser Aufruf nicht immer und es hat eine ganze Weile gedauert, bis ich drauf gekommen bin:<\/p>\n<h6>Vorsicht, Schreibmaschine!<\/h6>\n<p>Solltest du deine Python Programme nicht direkt auf dem Pi editieren (z.B. mit nano), sondern <a href=\"http:\/\/www.rustimation.eu\/index.php\/einfache-entwicklungsumgebung\/\" target=\"_blank\" rel=\"noopener noreferrer\">auf einem Windows Rechner<\/a>, kann es sein, dass der von dir verwendete Editor andere &#8211; unsichtbare\u00a0 &#8211; Zeilenkommandos in den Programmcode einf\u00fcgt als bei Linux \u00fcblich. Linux verwendet f\u00fcr eine neue Zeile das Zeichen f\u00fcr LF (Linefeed oder ASCII Char10), wohingegen Windows zwei\u00a0 Zeichen daf\u00fcr einf\u00fcgt, n\u00e4mlich CR (Carriage Return oder ASCII Char13) und LF. Linux akzeptiert das zwar beim Aufruf mit dem <code>python <\/code>Prefix aber leider nicht beim direkten Aufruf. Bl\u00f6d, is aber so.<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #808080;\">Immer wieder erstaunlich, welche Uralt Technologie sich hinter manchen Begriffen versteckt. CR = Carriage Return (Wagenr\u00fccklauf) und LF = Line Feed (Zeilenvorschub) sind Begrifflichkeiten aus der Fernschreiber und Schreibmaschinen \u00c4ra.<\/span><\/p>\n<p>Kopiert man ein <a href=\"http:\/\/www.rustimation.eu\/index.php\/einfache-entwicklungsumgebung\/\" target=\"_blank\" rel=\"noopener noreferrer\">in Windows editiertes Programm<\/a> (z.B. mit WinSCP) auf den Pi und der Editor kann keinen Linux Zeilenvorschub, klappt der direkte Aufruf nicht.<\/p>\n<p>Abhilfe gibt es durch das Programm <code>dos2unix<\/code>, welches die Windows (=DOS) Zeilenvorsch\u00fcbe auf Linux \u00fcbersetzt.<\/p>\n<p>Ist es auf dem Pi nicht vorhanden, kann man es durch<\/p>\n<pre class=\"lang:python decode:true \">sudo apt-get install dos2unix<\/pre>\n<p>nachinstallieren. In unserem Fall w\u00fcrden wir mit<\/p>\n<pre class=\"lang:python decode:true \">dos2unix checkinet.py<\/pre>\n<p>das Programm konvertieren und alles l\u00e4uft wie gew\u00fcnscht.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wie man Python Programme aufruft, ohne vorher \"python\" zu schreiben.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9,10],"tags":[130,133,18,131,34,42,132],"class_list":["post-117","post","type-post","status-publish","format-standard","hentry","category-python","category-raspberry-pi","tag-py","tag-aufrufen","tag-dos2unix","tag-programm","tag-python-2","tag-shebang","tag-starten"],"_links":{"self":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts\/117","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/comments?post=117"}],"version-history":[{"count":1,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts\/117\/revisions"}],"predecessor-version":[{"id":1642,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/posts\/117\/revisions\/1642"}],"wp:attachment":[{"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/media?parent=117"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/categories?post=117"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rustimation.eu\/index.php\/wp-json\/wp\/v2\/tags?post=117"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}