Kleine Frage zum Syntaxfehler -Absoluter Pythonneueinsteiger

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
lemon
User
Beiträge: 3
Registriert: Freitag 25. November 2011, 16:25

Hi Freunde,

habe mir jetzt mal Python 3.1 runtergeladen und dazu auch die pywin und pyserial.
Es handelt sich um ein fertiges und wohl lauffähiges Program zur Ausgabe von einigen Werten (Winkel vom IMU Board).
Habe um ehrlich zu sein nicht viel Ahnung von dem Programm, weil es erst seit paar Stunden auf dem Rechner ist.
Meine hätte alles richtig installiert usw. Nur kommt eine Syntaxfehler Meldung??

Woran kann das liegen? Weil wenn ich an C / c++ denke, könnte es höhstens an einer fehlenden Biobliothek sein, sonst kann ich damit nichts anfangen.
Würde mich freuen, wenn jeman nur einen Satz dazu schreiben könnte.

Denn Syntax Fehler wirds wohl nicht ganz sein, Programmiert ist es wohl richtig.

Unten ein Screenshot vom Fehler.

Liebe Grüße
BK


Bild
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

lemon hat geschrieben: habe mir jetzt mal Python 3.1 runtergeladen und dazu auch die pywin und pyserial.
Wieso verwendest Du eine so alte Version von Python?
lemon hat geschrieben: Es handelt sich um ein fertiges und wohl lauffähiges Program zur Ausgabe von einigen Werten (Winkel vom IMU Board).
Was ist "es" denn? Du hast ja bisher kein Programm erwähnt, sondern nur "Infrastruktur"...
lemon hat geschrieben: Meine hätte alles richtig installiert usw. Nur kommt eine Syntaxfehler Meldung??
Da `print` in Python 3 jetzt eine Funktion ist, in Python 2 aber ein Statement war, deutet vieles darauf hin, dass Du Dir eine falsche Python-Version zum Betrieb des Programmes installiert hast. Ich würde es mal mit einer aktuellen 2.7er versuchen ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
lemon
User
Beiträge: 3
Registriert: Freitag 25. November 2011, 16:25

Hey,

oha, stimmt vollkommen!!!!!

Es liegt selbstverständlich an der Syntax :D

Ja klar, habe es jetzt auch verstanden, dass es ab 3.x also Funktion geschrieben wird und somit ist der Fehler eindeutig.

Ich danke herzlichst Hyperion!

Denkemal, werde mich schnell in die Sprache reinarbeiten und hoffe mir gefällt das Pythonprogrammieren.

Sollte noch etwas sein, weiß ich ja, wo ich gut aufgehoben bin=)
Danke, für die mega Schnelle Hilfe!

Grüßle
BK
lemon
User
Beiträge: 3
Registriert: Freitag 25. November 2011, 16:25

Hier nochmals der Ganze Code fürs Anzeigen der 3 Winkel vom Prozessorboard.

Code: Alles auswählen

# Test for Razor 9DOF IMU
# Jose Julio @2009
# This script needs VPhyton, pyserial and pywin modules

# First Install Python 2.6.4
# Install pywin from http://sourceforge.net/projects/pywin32/
# Install pyserial from http://sourceforge.net/projects/pyserial/files/
# Install Vphyton from http://vpython.org/contents/download_windows.html

from visual import *
import serial
import string
import math

from time import time

grad2rad = 3.141592/180.0

# Check your COM port and baud rate
ser = serial.Serial(port='COM1',baudrate=57600, timeout=1)

# Main scene
scene=display(title="9DOF Razor IMU test")
scene.range=(1.2,1.2,1.2)
#scene.forward = (0,-1,-0.25)
scene.forward = (1,0,-0.25)
scene.up=(0,0,1)

# Second scene (Roll, Pitch, Yaw)
scene2 = display(title='9DOF Razor IMU test',x=0, y=0, width=500, height=200,center=(0,0,0), background=(0,0,0))
scene2.range=(1,1,1)
scene.width=500
scene.y=200

scene2.select()
#Roll, Pitch, Yaw
cil_roll = cylinder(pos=(-0.4,0,0),axis=(0.2,0,0),radius=0.01,color=color.red)
cil_roll2 = cylinder(pos=(-0.4,0,0),axis=(-0.2,0,0),radius=0.01,color=color.red)
cil_pitch = cylinder(pos=(0.1,0,0),axis=(0.2,0,0),radius=0.01,color=color.green)
cil_pitch2 = cylinder(pos=(0.1,0,0),axis=(-0.2,0,0),radius=0.01,color=color.green)
#cil_course = cylinder(pos=(0.6,0,0),axis=(0.2,0,0),radius=0.01,color=color.blue)
#cil_course2 = cylinder(pos=(0.6,0,0),axis=(-0.2,0,0),radius=0.01,color=color.blue)
arrow_course = arrow(pos=(0.6,0,0),color=color.cyan,axis=(-0.2,0,0), shaftwidth=0.02, fixedwidth=1)

#Roll,Pitch,Yaw labels
label(pos=(-0.4,0.3,0),text="Roll",box=0,opacity=0)
label(pos=(0.1,0.3,0),text="Pitch",box=0,opacity=0)
label(pos=(0.55,0.3,0),text="Yaw",box=0,opacity=0)
label(pos=(0.6,0.22,0),text="N",box=0,opacity=0,color=color.yellow)
label(pos=(0.6,-0.22,0),text="S",box=0,opacity=0,color=color.yellow)
label(pos=(0.38,0,0),text="W",box=0,opacity=0,color=color.yellow)
label(pos=(0.82,0,0),text="E",box=0,opacity=0,color=color.yellow)
label(pos=(0.75,0.15,0),height=7,text="NE",box=0,color=color.yellow)
label(pos=(0.45,0.15,0),height=7,text="NW",box=0,color=color.yellow)
label(pos=(0.75,-0.15,0),height=7,text="SE",box=0,color=color.yellow)
label(pos=(0.45,-0.15,0),height=7,text="SW",box=0,color=color.yellow)

L1 = label(pos=(-0.4,0.22,0),text="-",box=0,opacity=0)
L2 = label(pos=(0.1,0.22,0),text="-",box=0,opacity=0)
L3 = label(pos=(0.7,0.3,0),text="-",box=0,opacity=0)

# Main scene objects
scene.select()
# Reference axis (x,y,z)
arrow(color=color.green,axis=(1,0,0), shaftwidth=0.02, fixedwidth=1)
arrow(color=color.green,axis=(0,-1,0), shaftwidth=0.02 , fixedwidth=1)
arrow(color=color.green,axis=(0,0,-1), shaftwidth=0.02, fixedwidth=1)
# labels
label(pos=(0,0,0.8),text="9DOF Razor IMU test",box=0,opacity=0)
label(pos=(1,0,0),text="X",box=0,opacity=0)
label(pos=(0,-1,0),text="Y",box=0,opacity=0)
label(pos=(0,0,-1),text="Z",box=0,opacity=0)
# IMU object
platform = box(length=1, height=0.05, width=1, color=color.red)
p_line = box(length=1,height=0.08,width=0.1,color=color.yellow)
plat_arrow = arrow(color=color.green,axis=(1,0,0), shaftwidth=0.06, fixedwidth=1)


f = open("Serial"+str(time())+".txt", 'w')

roll=0
pitch=0
yaw=0
while 1:
    line = ser.readline()
    line = line.replace("!ANG:","")   # Delete "!ANG:"
    print "line"
    f.write(line)                     # Write to the output log file
    words = string.split(line,",")    # Fields split
    if len(words) > 2:
        try:
            roll = float(words[0])*grad2rad
            pitch = float(words[1])*grad2rad
            yaw = float(words[2])*grad2rad
        except:
            print "Invalid line"

        axis=(cos(pitch)*cos(yaw),-cos(pitch)*sin(yaw),sin(pitch)) 
        up=(sin(roll)*sin(yaw)+cos(roll)*sin(pitch)*cos(yaw),sin(roll)*cos(yaw)-cos(roll)*sin(pitch)*sin(yaw),-cos(roll)*cos(pitch))
        platform.axis=axis
        platform.up=up
        platform.length=1.0
        platform.width=0.65
        plat_arrow.axis=axis
        plat_arrow.up=up
        plat_arrow.length=0.8
        p_line.axis=axis
        p_line.up=up
        cil_roll.axis=(0.2*cos(roll),0.2*sin(roll),0)
        cil_roll2.axis=(-0.2*cos(roll),-0.2*sin(roll),0)
        cil_pitch.axis=(0.2*cos(pitch),0.2*sin(pitch),0)
        cil_pitch2.axis=(-0.2*cos(pitch),-0.2*sin(pitch),0)
        arrow_course.axis=(0.2*sin(yaw),0.2*cos(yaw),0)
        L1.text = str(float(words[0]))
        L2.text = str(float(words[1]))
        L3.text = str(float(words[2]))        
ser.close
f.close
Zuletzt geändert von Anonymous am Freitag 25. November 2011, 17:18, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

So langen Code lagere doch bitte in ein Paste-Bin aus, z.B. paste.pocoo.org oder das hier im Forum integrierte.

Zudem haben wir für Python-Code spezielle Python-Code-Tags.

Zum Code: Hast Du den geschrieben? Da sind einige Ungereimtheiten drin und er sieht leider ziemlich hässlich aus. Keine sinnvolle Unterteilung, Alles auf Modulebene, Copy- und Paste-Programmierung, magic numbers so weit das Auge reicht, schlichte Fehler (`file.close`), keine Dokumentation, uvm. Eine detaillierte Review erstellt Dir sicher BlackJack, oder ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@lemon: Wie Hyperion ja schon sagte ist das kein besonders schöner Python-Quelltext.

Das `math`-Modul enthält nicht nur die Konstante `math.pi` sondern auch Funktionen zum Umrechnen von Grad in Bogenmass und umgekehrt.

Die Formatierung des Quelltextes weicht zum Beispiel beim setzen von Leerzeichen vom PEP 8 -- Style Guide for Python Code ab. Dem muss man zwar nicht blind folgen, aber viele Empfehlungen dort dienen der besseren Lesbarkeit des Quelltextes.

Man sollte Namen so wählen, dass sie selbsterklärend sind und man keine Kommentare braucht, die Informationen enthalten, die man auch im Namen unterbringen könnte. Insbesondere durchnummerieren erhöht die Verständlichkeit von Quelltext nicht besonders. Statt `scene` und `scene2` könnte man zum Beispiel `main_scene` und `orientation_scene` oder `roll_pitch_yaw_scene` verwenden.

Wenn man Dateien mit der ``with``-Anweisung öffnet, kann man sicher sein, dass sie auch unter allen Umständen ordnungsgemäss geschlossen werden.

Statt Zeichenketten mit ``+`` und `str()` zusammen zu setzen, verwendet man in Python eher Zeichenkettenformatierung mittels ``%``-Operator oder der `format()`-Methode auf Zeichenketten.

Python hat einen eigenen Datentyp für Wahrheitswerte, den man auch verwenden sollte — also ``while True:`` statt ``while 1:``. Die ``while``-Schleife ist aber sowieso umständlich, denn man kann über die Zeilen direkt über das `serial.Serial`-Objekt iterieren, genau wie bei Dateiobjekten. Mit `contextlib.closing()` kann man auch `Serial`-Objekte mit der ``with``-Anweisung verwenden.

Man sollte nicht einfach nur ``except:`` ohne ein konkrete Ausnahmen verwenden. Damit behandelt man *alle* Ausnahmen, auch solche die dann gar nicht zu der Ausgabe passen dass die Zeile ungültig war. Zum Beispiel wenn man sich im ``try``-Block bei einem Namen vertippt hat. Die Fehlermeldung dazu bekommt man dann nie zu Gesicht, weil auch *das* zur Ausgabe von "Invalid line" führen würde.

Die Fehlerbehandlung funktioniert auch nicht so ganz. Wenn die Zeile ungültig war, wird trotzdem an der Anzeige weiter gerechnet. Entweder mit komplett alten Daten oder mit teilweise veralteten Daten und potentiell falschen Neuen. Spätestens am Ende kracht es dann weil da nochmal die Umwandlung in Gleitkommazahlen vorgenommen wird. Wenn das oben im ``try``-Block nicht klappte, wird es etwas später mit den gleichen Ausgangsdaten wieder nicht funktionieren.
Antworten