Cocktailmaschine Bartender.py Problem

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Tim_Raspberry Pi
User
Beiträge: 14
Registriert: Donnerstag 24. Oktober 2024, 21:14

Hallo , ich programmiere gerade einen Cocktailmaschine nach dem ich alles eingerichtet habe , wurde der Code aus dem Internet heruntergeladen .
Ich wollte ihn mit dem hier drunter stehen ,, sudo Python bartender.py starten , leider kam der folgende Fehler , habt ihr eventuell eine Idee ? ´´home/azubi29/Downloads/bartender.py´´, line 123
def readPumpConfiguration():
IndentationError: unindent does not match any outer indentation level

Unter folgenden Link ist die Bartender.py zu finden . Vielleicht kann mir ja wer behilflich sein

https://github.com/Pazekal90/Smart-Bart ... rtender.py

Gruß Tim
Benutzeravatar
sparrow
User
Beiträge: 4525
Registriert: Freitag 17. April 2009, 10:28

Die Namensgebung lässt vermuten, dass die bartender.py nicht von jemanden geschrieben wurde, der regelmäßig Python entwickelt.

Die Fehlermeldung sagt: Irgendwo stimmt etwas mit der Einrückung nicht, was dem Parser in Zeile 123 auffällt.
Entweder ist die Zeile (oder eine Zeile auf dem Weg dorthin) falsch eingerückt.

Der Autor der Datei rückt mit Tabs ein, nicht mit Leerzeichen, wie es eigentlich Konvention ist.
Und Zeile 75 fällt augenscheinlich völlig aus dem Rahmen.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1217
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Zeile 68 hat die falsche Einrückung. Es werden Tabs verwendet. Es sollten aber 4 Leerzeichen verwendet werden.

Code: Alles auswählen

PS C:\Users\XXX\Downloads> py -3.13 -m ruff check .\bartender.py
bartender.py:68:1: SyntaxError: unindent does not match any outer indentation level
   |
67 |         # configure interrups for buttons
68 |         GPIO.setup(self.btn1Pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
   | ^^^^
69 |         GPIO.setup(self.btn2Pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
   |

bartender.py:118:9: SyntaxError: Simple statements must be separated by newlines or semicolons
    |
116 |         self.strip.show()
117 |
118 |         print "Done initializing"
    |               ^
119 |
120 |     @staticmethod
    |

bartender.py:255:16: E703 Statement ends with an unnecessary semicolon
    |
254 |         # sleep for a couple seconds to make sure the interrupts don't get triggered
255 |         time.sleep(2);
    |                      ^ E703
256 |
257 |     def shutdown(self):
    |
    = help: Remove unnecessary semicolon

bartender.py:270:16: E703 Statement ends with an unnecessary semicolon
    |
268 |         self.led.image(self.image)
269 |         self.led.display()
270 |         time.sleep(5);
    |                      ^ E703
271 |
272 |         #Clean shutdown device
    |
    = help: Remove unnecessary semicolon

bartender.py:277:9: SyntaxError: Simple statements must be separated by newlines or semicolons
    |
276 |     def displayMenuItem(self, menuItem):
277 |         print menuItem.name
    |               ^
278 |         self.led.clear()
279 |         self.draw.rectangle((0,0,self.screen_width,self.screen_height), outline=0, fill=0)
    |

bartender.py:306:19: E701 Multiple statements on one line (colon)
    |
304 |                 head    = 0              # Reset to start
305 |                 color >>= 8              # Red->green->blue->black
306 |                 if(color == 0): color = 0xFF0000 # If black, reset to red
    |                               ^ E701
307 |
308 |             tail += 1                        # Advance tail position
    |

bartender.py:309:30: E701 Multiple statements on one line (colon)
    |
308 |             tail += 1                        # Advance tail position
309 |             if(tail >= self.numpixels): tail = 0  # Off end? Reset
    |                                       ^ E701
310 |
311 |     def lightsEndingSequence(self):
    |

bartender.py:382:16: E703 Statement ends with an unnecessary semicolon
    |
381 |         # sleep for a couple seconds to make sure the interrupts don't get triggered
382 |         time.sleep(2);
    |                      ^ E703
383 |
384 |         # reenable interrupts
    |
    = help: Remove unnecessary semicolon

Found 8 errors.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Sirius3
User
Beiträge: 18250
Registriert: Sonntag 21. Oktober 2012, 17:20

@Tim_Raspberry Pi: die von Dir verlinkte Datei läßt sich ohne Probleme starten. Die von dir angegeben Zeile 123 ist eine Leerzeile, Du hast die Datei also irgendwie modifiziert. Benutzt Du auch Python 2.7?
@sparrow: bei Kommentaren ist die Einrückung egal
@DeaD_EyE: es handelt sich um ein Python2-Programm, dort sind die Tab-Space-Regeln noch freier.
Benutzeravatar
__blackjack__
User
Beiträge: 13997
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

An der statischen Analyse in DeaD_EyeEs Beitrag sieht man an den Semikolons die Vermutung bestätigt, dass das kein Python-Programmierer geschrieben hat. Und wenn man dann rein schaut die ganzen unnötigen Klammern bei ``if`` & Co, oder wie über Schlüssel iteriert wird um in der Schleife dann über den Schlüssel auf die Werte zuzugreifen, statt gleich über die Werte zu iterieren, oder Schlüssel/Wert-Paare wenn man beides braucht.

Die Objektorientierung lässt auch zu wünschen übrig mit den ganzen Schleifen, die immer wieder ähnlich über eine verschachtelte Wörterbuchstruktur iterieren oder die Indirektion über Zeichenketten die einen ”Typ” repräsentiert, wo dann per ``if``/``elif``-Kaskade herausgefunden wird was anhand dieses Typs für Verhalten folgen soll, statt dass das Objekt von dem man diese Zeichenkette abgefragt hat, das Verhalten kennt/implementiert. Und das mindestens in zwei verschiedenen Funktionen.

Oder dieses ”Schmuckstück”, das es noch mal mit leicht anderen Namen gibt:

Code: Alles auswählen

    TextNew = ''
    for ii in words_list[:-1]:
        TextNew = TextNew + ii + "\n"
    TextNew += words_list[-1]
`self.running` kann `True` oder `False` sein, und es kann den Wert 2 annehmen — WTF‽ Aber klar, das macht natürlich Sinn wenn man dann folgenden Code findet:

Code: Alles auswählen

                    if self.running not in (True,False):
                        self.running -= 0.1
                        if self.running == 0:
                            self.running = False
Ich nehme mal an dem Autor war nicht klar, dass man aus der Nummer nicht mehr raus kommt wenn das mal 2 angenommen hat, weil das dann auf dem Weg nach unten weder 1 (True) noch 0 (False) treffen wird, weil Gleitkommazahlen und (Un)genauigkeit:

Code: Alles auswählen

In [2]: 2 - 0.1
Out[2]: 1.9

In [3]: _ - 0.1
Out[3]: 1.7999999999999998

In [4]: _ - 0.1
Out[4]: 1.6999999999999997

In [5]: _ - 0.1
Out[5]: 1.5999999999999996

In [6]: _ - 0.1
Out[6]: 1.4999999999999996

In [7]: _ - 0.1
Out[7]: 1.3999999999999995

In [8]: _ - 0.1
Out[8]: 1.2999999999999994

In [9]: _ - 0.1
Out[9]: 1.1999999999999993

In [10]: _ - 0.1
Out[10]: 1.0999999999999992

In [11]: _ - 0.1  # Wird leider nicht 1.
Out[11]: 0.9999999999999992

In [12]: _ - 0.1
Out[12]: 0.8999999999999992

In [13]: _ - 0.1
Out[13]: 0.7999999999999993

In [14]: _ - 0.1
Out[14]: 0.6999999999999993

In [15]: _ - 0.1
Out[15]: 0.5999999999999993

In [16]: _ - 0.1
Out[16]: 0.49999999999999933

In [17]: _ - 0.1
Out[17]: 0.39999999999999936

In [18]: _ - 0.1
Out[18]: 0.2999999999999994

In [19]: _ - 0.1
Out[19]: 0.19999999999999937

In [20]: _ - 0.1
Out[20]: 0.09999999999999937

In [21]: _ - 0.1  # Und auch 0 treffen wir hier nicht.
Out[21]: -6.38378239159465e-16
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Benutzeravatar
Kebap
User
Beiträge: 772
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Tim_Raspberry Pi hat geschrieben: Donnerstag 24. Oktober 2024, 21:22 Hallo , ich programmiere gerade einen Cocktailmaschine nach dem ich alles eingerichtet habe , wurde der Code aus dem Internet heruntergeladen .
Hallo Tim, zeigst du uns auch, was du programmiert hast? :mrgreen:
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Tim_Raspberry Pi
User
Beiträge: 14
Registriert: Donnerstag 24. Oktober 2024, 21:14

Hi , danke für die ganze Hilfe . Das Programm habe ich alles heruntergeladen, auf den raspberry pi gespeichert. Mit dem einrückfehler habe ich herausgefunden nun habe ich ein ELFClass Fehler 32 . Liegt das an der Architektur des raspberrys da dieser ja 64 Bit hat ? Und das ja ein 32 Bit Fehler ist ? Was kann ich tuen das der Fehler verschwindet ?
Gruß Tim
Benutzeravatar
__blackjack__
User
Beiträge: 13997
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Tim_Raspberry Pi: Am besten einen anderen Quelltext als Basis nehmen, oder Python (3!) lernen und selbst ein Programm entwickeln. 🙂
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Tim_Raspberry Pi
User
Beiträge: 14
Registriert: Donnerstag 24. Oktober 2024, 21:14

Ja, hoffe einfach das es klappt jetzt . Die Zeit habe ich leider nicht mehr ich muss in 2 Wochen meine Prüfung abgeben 😅

Was kann ich dagegen tuen das es läuft .
Gruß
Tim_Raspberry Pi
User
Beiträge: 14
Registriert: Donnerstag 24. Oktober 2024, 21:14

@sirius3 In der Anleitung die ich verlinkte hatte steht das es Python 3 ist , da habe ich mich drauf verlassen .
Aber leider sind ja ein paar Fehler drin
Tim_Raspberry Pi
User
Beiträge: 14
Registriert: Donnerstag 24. Oktober 2024, 21:14

Wie bekomme ich sonst Python 2.7 auf den raspberry ? Oder könnte dir mir wer umschreiben ? Natürlich gegen einen Obolus wenn alles nicht mehr hilft 😅
Gruß Tim
Benutzeravatar
__blackjack__
User
Beiträge: 13997
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Tim_Raspberry Pi: Du brauchst nichts dagegen tun das es läuft — es läuft ja nicht. 😈

Hier sind die Änderungen zum Originalprojekt: https://github.com/Joe2824/Smart-Barten ... der:master — da ist ausser der Behauptung in der Readme, dass es mit Python 3 läuft, nichts gemacht worden, dass es auch tatsächlich mit Python 3 läuft.

Der Quelltext ist 6 Jahre alt, für Python 2.7 geschrieben, hat eine binäre Bibliothek für ARM 32 ohne Quelltext im Repository, und sieht auch nicht nach gutem, idiomatischem Python-Quelltext aus. Das ist einfach keine sinnvolle Basis für ein aktuelles Projekt.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Tim_Raspberry Pi
User
Beiträge: 14
Registriert: Donnerstag 24. Oktober 2024, 21:14

Gut , was können wir machen das es läuft ?
Gruß Tim 😅
Benutzeravatar
__blackjack__
User
Beiträge: 13997
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Nichts sinnvolles. 🤷‍♂️
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Sirius3
User
Beiträge: 18250
Registriert: Sonntag 21. Oktober 2012, 17:20

Du kannst Dir Hardware von vor 10 Jahren besorgen, einen Raspberry PI2 Model B1 mit ARM-Cortex A7 Prozessor. Darauf ein aus dieser Zeit stammendes Image draufspielen und hoffen, dass Du damit das Programm ans Laufen bringst.
Tim_Raspberry Pi
User
Beiträge: 14
Registriert: Donnerstag 24. Oktober 2024, 21:14

Aber warum funktioniert es bei denen in der Software ? Mit was hängt das zusammen ?
Benutzeravatar
__blackjack__
User
Beiträge: 13997
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Tim_Raspberry Pi: Bei wem funktioniert was? Das ist Python 2.7 Code mit einer kompilierten ARM 32 Bibliothek. Das ganze ist 6 Jahre alt und wurde für einen Raspi 3 geschrieben. Wenn das ohne Änderungen läuft, dann auf einem entsprechend alten System mit Python 2.7.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Tim_Raspberry Pi
User
Beiträge: 14
Registriert: Donnerstag 24. Oktober 2024, 21:14

Es hatte doch wer geschrieben hier in dem Beitrag das es problemlos läuft der Code . Was bräuchte ich für einen raspberry für Python 2.7 ?
Gruß Tim
Benutzeravatar
Dennis89
User
Beiträge: 1516
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

hast du die Antwort von @Sirius3 gelesen?

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Tim_Raspberry Pi
User
Beiträge: 14
Registriert: Donnerstag 24. Oktober 2024, 21:14

Hallo , ja mit dem raspberry 1 . Meint ihr es würde auch gehen auf einen raspberry 3 b + Python 2.7 aufzuspielen ? Oder würde das nicht funktionieren?
Gruß Tim
Antworten