• Ich grüße euch,

    ich bin ein gelegenheits R-Pi Bastler mit noch recht wenig Erfahrung im Programmieren. Viele Probleme die sich mir bes jetzt gestellt haben konnte mit langem Suchen im Internet losen, und wollte es eigentlich vermeiden dein Foren-Team mit meinen Unzulänglichkeiten zu belästigen. Aber im Moment gehen mir die Ideen aus und ich erbitte daher eure Hilfe.

    Kann es sein, daß der R-Pi ein Problem damit hat die try und except Befehle zu interpretieren?

    Ich habe hier ein kleines Programm geschrieben, welches einen Servo steuern soll:

    Ich weiß, das man das auch mit vorgefertigten Modulen eleganter lösen kann, aber ich wollte so ein Programm eben mal selber machen :D .

    Das soll passieren:

    -Mit einem "input" Befehl gebe ich eine Zahl ein (den Winkel).
    -Unter "try" wird die Eingabe dann in einen "float" -Wert umgewandelt, sofern die Eingabe eine Zahl ist.
    -Ist die Eingabe ein Wort, soll mit "except" weitergemacht werden
    -Hier wird unterschieden, ob es sich bei dem Wort um "exit" handelt (dann soll das Programm beendet werden), oder ein anderer, nicht interpretierbarer Blödsinn (dann soll das Programm dies Beanstanden, und erneut zur Winkeleingabe auffordern).

    Nun zum Problem:

    Das Ganze funktioniert auf dem Rechner im "Ausführenfenster" ganz hervorragend :thumbs1: . Wenn ich das aber auf den R-Pi übertrage und dort ausführe, lauft alles gut solange ich Zahlen eingebe. Gebe ich aber "exit" ein, wird das ignoriert, und das Programm fragt erneut nach der Winkeleingabe :wallbash: . Gebe ich ein Buchstaben-Kauderwelsch ein (sfklhfsygl) bekomme ich eine Fehlermeldung. :@

    Da komme ich mit meinen rudimentären Kenntnissen nicht weiter. Ich hoffe Ihr habt da ne Idee und sag schonmal :danke_ATDE:

  • Hallo,

    Zitat

    Kann es sein, daß der R-Pi ein Problem damit hat die try und except Befehle zu interpretieren?


    Nein, weil das völlig unabhängig von der Hardware ist, sondern dafür alleine der Python-Interpreter zuständig ist. Wobei sich das alle verfügbaren Python-Version bei `try... except` gleich verhalten.

    Abgesehen davon: mit korrekten Einrückungen funktioniert der Code, wie er soll. Sprich, du machst auf deinem Raspi wohl irgendwas falsch. Welche Fehlermeldung bekommst du denn?

    BTW: in dem Code sind noch ein paar andere Sachen unsinnig...

    Gruß, noisefloor

  • Wow, hätte nicht gedacht, daß es so schnell eine Rückmeldung gibt. Erstmal Danke dafür.

    Ja, also, was die Einrückungen betrifft, so haut das aus dem Ursprungstext schon hin. Nur habe ich den Code direkt aus dem Notepad++ kopiert. Es hat aber kurioserweise die TAB´s nicht in das Textfeld hier übertragen. Und da der Curser immer wieder raus gesprungen ist, wenn ich TAB gedrückt hab, hab ich mich eben mit einer frei interpretierten Anzahl von Leerzeichen beholfen :D .


    Bei einer nicht definierten Eingabe (dshf) habe ich folgende Fehlermeldung

    Traceback (most recent call last):
    File "R-Pi_Servoansteuerung.py", line 56, in <module>
    angle_input= input("Winkel eingeben (-90 bis 90): ")
    File "<string>", line 1, in <module>
    NameError: name 'dshf' is not defined

    Ist mir schleierhaft, wie das Programm versucht die Eingabe zu definieren wenn es das doch gar nicht soll.
    Was ich auf dem Raspberry falsch machen soll ist mir leider auch nicht ganz klar, denn ich mach ja nicht viel außer die DAtei mit Filezilla auf das Ding zu übertragen und mit putty das Programm auf zu rufen

    Was die unsinnigen Positionen meines Textes angeht, so bin ich für konstruktive Kritik immer offen.

    • Offizieller Beitrag

    deswegen nimmt auch immer raw_input() anstelle von input. Bei python3 ist das imho gelöst. Bei input kannst du auch 1+1 eingeben und in der Variable würde 2 stehen.

    Der Unterschied zwischen Genie und Wahnsinn definiert sich im Erfolg.

    Einmal editiert, zuletzt von dbv (13. September 2017 um 21:00)

  • Zitat von &quot;Heinz Doofenschmirz&quot; pid='299568' dateline='1505329006'


    Es hat aber kurioserweise die TAB´s nicht in das Textfeld hier übertragen.

    Dann nutzt du sowohl Leerzeichen als auch TAB's? => böse! Einheitlich oder gar nicht!

    Bitte zeige deinen Code erneut: FAQ => Nützliche Links / Linksammlung => HowTo: CODE / PHP Code im Forum posten
    Ohne den tatsächlich eingesetzten Code zu sehen kann man nicht wirklich weiteres sagen.

    Zitat von &quot;Heinz Doofenschmirz&quot; pid='299568' dateline='1505329006'

    Und da der Curser immer wieder raus gesprungen ist, wenn ich TAB gedrückt hab, hab ich mich eben mit einer frei interpretierten Anzahl von Leerzeichen beholfen :D .

    Pro Einrückung werden normalerweise 4 Leerzeichen genutzt, nicht 3 oder 5 sondern 4. Einheitlich!
    In Notepad++ kann man das sogar einstellen, dass beim drücken von TAB stattdessen Leerzeichen gesetzt werden... Einstellungen => Optionen => Tabulatoren

  • Hallo,

    Heinz Doofenschmirz: welche Python Version benutzt du? Python 2.7 oder 3.x? Das macht in der Tat eine Unterschied bei `input`.

    Zum Thema unsinnig:

    `exit = float(0)` ist unsinnig. Also Null in einen Float 0.0 wandeln macht keine Sinn. Außerdem verwendest du `exit` im gezeigten Code nirgendwo.

    `freq = float(50.0)` ist unsinnig. 50.0 ist bereits vom Typ `float`.

    Nackte `try... except` möchte man nicht nutzen, weil damit _alle_ Fehler abgefangen werden. Auch solche, die man vielleicht gar nicht abfangen will. Man fängt gezielt Fehler ab. Hier also `except ValueError:`

    Gruß, noisefloor

  • OK OK, das mit den Leerzeichen hab ich nicht gewußt, Das werd ich im Notepad gleich ändern.


    Zitat

    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Dann nutzt du sowohl Leerzeichen als auch TAB's? => böse! Einheitlich oder gar nicht![/font]

    Also eigentlich habe ich immer nur TAB´s zum Einrücken genutzt. Ich versuche drauf zu achten dass mein Chaos möglichst einheitlich ist.

    Die Zeile 56 ist übrigens die, wo der Winkel eingegeben werden soll der Text ist schon komplett.

    Zitat

    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]deswegen nimmt auch immer raw_input() anstelle von input. Bei python3 ist das imho gelöst. Bei input kannst du auch 1+1 eingeben und in der Variable würde 2 stehen.[/font]


    Soweit ich mich erinnere ist raw_input ein Bestandteil aus Python 2 und macht das Gleiche wie input in Python 3. Ich kann mich aber auch irren.

    Gleichwohl, da das Programm auf dem Rechner funktioniert, liegt mein Hauptproblem momentan im Nichtfunktionieren auf dem R-Pi.

  • Zitat von &quot;Heinz Doofenschmirz&quot; pid='299587' dateline='1505330891'


    Also eigentlich habe ich immer nur TAB´s zum Einrücken genutzt. Ich versuche drauf zu achten dass mein Chaos möglichst einheitlich ist.

    Dann müssten aber alle Einrückungen kaputt sein - was aber nicht der Fall ist, zwar gestört aber nicht komplett weg.
    Öffne deinen Code in notepad++, markiere und kopiere ein TAB, drücke STRG+F, wähl den Reiter "Ersetzen", füge in "Suchen nach" das zuvor kopierte TAB ein, füge in "Ersetzen durch" 4 Leerzeichen ein, drücke auf "Alle ersetzen". Füge korrigierten Code hier im Forum ein.

    Zitat von &quot;Heinz Doofenschmirz&quot; pid='299587' dateline='1505330891'


    Soweit ich mich erinnere ist raw_input ein Bestandteil aus Python 2 und macht das Gleiche wie input in Python 3.

    Aus deinem Code geht aber nicht hervor ob Du es über python2 oder python3 ausführst...

    guckst du :fies:

  • Ihr seid mit Antworten schneller, als ich mit reagieren :lol:

    Zitat

    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"] noisefloor: welche Python Version benutzt du? Python 2.7 oder 3.x? Das macht in der Tat eine Unterschied bei `input`.[/font]


    Also, ich verwende Python 3

    Zitat

    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]`exit = float(0)` ist unsinnig. Also Null in einen Float 0.0 wandeln macht keine Sinn. Außerdem verwendest du `exit` im gezeigten Code nirgendwo.[/font]

    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]`freq = float(50.0)` ist unsinnig. 50.0 ist bereits vom Typ `float`.[/font]

    Das alles in float zu setzen, hab ich auch nur gemacht, weil es nur so im Raspberry funktionierte... soweit das Programm eben funktioniert. Ich hatte immer wieder das Problem, das der RPI das Format der Zahlen nicht erkennen konnte. also habe ich in meiner Verzweiflung jede Variable vordefiniert.

    Zitat

    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Man fängt gezielt Fehler ab. Hier also `except ValueError:`[/font]

    Das mit dem`except ValueError:` werde ich mal versuchen. Das hab ich in meinem Lehrbuch wohl überlesen... oder vergessen. :lol:

  • ...Der Pi hat damit nichts zu tun, der Pi ist die Hardware aber die interpretiert dein Script nicht ;)

    float wird es in python automatisch sofern man zB 50.0 setzt:

    Code
    >>> type(50.0)
    <class 'float'>
    >>> exit = 50.0
    >>> type(exit)
    <class 'float'>
    >>>

    es ist also wirklich Unsinn noch mal explizit float(50.0) zu setzen.
    Davon abgesehen ist der Variablenname "exit" ungünstig gewählt.

    Du erwartest aber auch dass dein "try" fehl schlägt? Allgemein scheint mir die Verwendung falsch zu sein...

    Wir sollten erst mal festhalten dass du unbedingt den aktuellen Code posten solltest - mit korrekten Einrückungen. Solange das nicht gemacht wurde werde zumindest ich nichts weiter posten ;)

  • Sooo, ich habe die Einrückungen mit 4 Leerzeichen pro Tab geändert

    Ich hab ihn auf dem Rechner auch nochmal gestestet. Da läuft er...

  • Zitat von &quot;Heinz Doofenschmirz&quot; pid='299596' dateline='1505332970'


    Ich hab ihn auf dem Rechner auch nochmal gestestet. Da läuft er...

    Es fehlt erneut die Information mit welcher Python Version du dein Script auf dem Pi ausführst....

    Ich wette mit dir das genau da dein Problem begraben liegt, denn wenn du auf dem PC "python script.py" ausführst aber nur ein Python installiert hast, würde das auf dem Pi mit python2 ausgeführt werden...

    ...auf meinem Pi funktioniert das Script mit der richtigen Python Version nämlich auch...obgleich es echt dirty geschrieben ist, das float Zeug usw solltest du echt anpassen - sonst lernst du es falsch.


    Verstehste jetzt wieso wir seit gefühlten 5 Beiträgen diese Info einfordern?

  • Ich hatte es weiter oben schon mal erwähnt. Ich schreibe das Programm auf Python 3. Ich habe auf dem Rechner auch P3 installiert. Beim RPi bin ich mir nicht sicher. Aber wäre es P2 dürfte doch der "print"-Befehl auch nicht ausgeführt werden, da der in P2 z.B. ohne Klammern geschrieben wird.
    Automatisch zusammengefügt:

    Zitat

    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Ich wette mit dir das genau da dein Problem begraben liegt, denn wenn du auf dem PC "python script.py" ausführst aber nur ein Python installiert hast, würde das auf dem Pi mit python2 ausgeführt werden... [/font]

    Ich muss gestehen, dass ich mir nicht sicher bin ob ich diesen Satz richtig interpretiere. Was meinst du mit "...aber nur ein Python installiert hast." Wie sollte ich´s denn anders ausführen?

  • Nö, wenn er nur eine Python Version installiert hat kann das "python" binary/script/symlink auch Python 3 ausführen, unter allen os. Setzt der installer unter Windows IMHO dann als default. Auf der Arbeit jedenfalls habe ich nur Python3 und da gibt es den Befehl "python3" in der cmd gar nicht :P

    Lange Rede kurzer Sinn: mit welchen Versionen führst du wo aus?

    LG

  • Also, auf dem Laptop habe ich Python 3 Installiert.

    Auf dem R-Pi bin ich mir nicht ganz sicher. Ich hab ihn mir von einem Freund einrichten lassen, weil ich vor zwei Jahren noch kein Internet hatte. Da aber beispielsweise der "Print"-Befehl in der Python 3 Schreibweise ausgeführt wird, gehe ich davon aus, dass eda auch Python 3 installiert ist.

  • OK, das ist eine gute Idee den R-Pi selbst mal zu fragen, mit was er arbeitet. Tatsächlich sind wohl zwei Versionen installiert.

    Hier die Ausgabe der von dir angegebenen Befehle

    Code
    pi@raspberrypi ~ $ which python
    /usr/bin/python
    pi@raspberrypi ~ $ which python3
    /usr/bin/python3
    pi@raspberrypi ~ $ python -V
    Python 2.7.3
    pi@raspberrypi ~ $ python3 -V
    Python 3.2.3

    Ausführen tu ich das Programm mit

    Code
    sudo python R-Pi_Servoansteuerung.py
  • Ja guckst du... Du übergibst dein Script auf dem Pi also an python2. Hinter dem Befehl "python" verbirgt sich Python 2.7.3

    Du musst es aber so ausführen:

    Code
    python3 R-Pi_Servoansteuerung.py


    PS: PEBKAC => Problem Exists Between Keyboard And Chair .... PICNIC => Problem In Chair Not In Computer
    :fies:

  • Ich werd WAHNSINNIG :wallbash: DAS GEEEHT... :bravo2:

    Das heißt ja, dass ich bei all meinen kleinen Vorgänger-Skripts nur Glück hatte, dass die funktionieren... Oh man, das vereinfacht natürlich alles. Da kann ich jetzt auch die ganzen dussligen Float Definitionen raus nehmen.

    Das ist der Hammer, und ich bin echt dankbar... ich wäre da sonst in 100 Jahren nicht drauf gekommen.

    :danke_ATDE: :danke_ATDE: :danke_ATDE:
    Automatisch zusammengefügt:

    Zitat

    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]PS: PEBKAC => Problem Exists Between Keyboard And Chair .... PICNIC => Problem In Chair Not In Computer [/font]

    undefined

    Da kann ich dir nur aus tiefstem Herzen zustimmen. :D

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!