Skipt findet Modul nicht wenn im Terminal fenster gestartet

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,

    da ich gerade anfange mich mit Python zu befassen, stoße ich auf Ungereimtheiten, die ich mir (noch) nicht erklären kann:

    Ich nutze:

    RPI 3B+

    Rasbian Buster vom 7.5.2021 (Raspberry Pi OS with desktop and recommended software)

    Update und Upgrade (gestern) durchgeführt

    Für meine ersten Programmierversuche nutze ich die mitgelieferte IDE (Thonny)

    Mein Code läuft auch ohne Probleme wenn ich aus der IDE starte, versuche ich den Start allerdings aud dem Terminalfenster mit "sudo python3 camera02.py", wird das Modul fpdf nicht gefunden.

    Installiert habe ich das Modul mit den Tools von Thonny.

    Hier mal mein Code:

    Bitte schimpft nicht zu laut mit mir, fall der Code nicht euren ästhetischen Ansprüchen genügt - ich arbeite dran! :)

  • Skipt findet Modul nicht wenn im Terminal fenster gestartet? Schau mal ob du hier fündig wirst!

  • koelnpub Tonny legt soweit ich weiss virtuelle Umgebungen („venvs“) pro Projekt an, in die Packages installiert werden. Die werden zum Beispiel im Tutorial in der Python-Dokumentation gegen Ende behandelt.

    Edit: Bei dem Quelltext fehlen sämtliche Einrückungen.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • koelnpub: Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.Funktion

    Funktion (und Methoden) bekommen alles was sie ausser Konstanten benötigen, als Argument(e) übergeben. `imager()` braucht also beispielsweise das Kamera-Objekt als Argument.

    Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).

    Einige Namen könnten inhaltlich besser sein. Bei `GPIOPin` würde den Leser beispielsweise interessieren was für eine Bedeutung dieser Pin hat. `t1` ist absolut nichtssagend.

    Funktionen werden üblicherweise nach der Tätigkeit benannt, die sie durchführen, um sie leichter von eher passiven Werten unterscheiden zu können. Weder `imager()` noch `pdfpage()` sind Tätigkeiten.

    Grunddatentypen haben nichts in Namen verloren. Den Typen ändert man gar nicht so selten mal während der Programmentwicklung und dann muss man überall im Programm die betroffenen Namen ändern, oder man hat falsche, irreführende Namen im Quelltext.

    Das aktuelle Datum würde man eher nicht als Konstante erstellen sondern immer aktuell dann ermitteln wenn es gebraucht wird. So ein Raspi kann ja problemlos auch die nach über mal durchlaufen und dann würde das Programm mit einem falschen Datum weiterarbeiten. Das Datum ermitteln ist aber keine besonders aufwändige/teure Aktion, diese Fehlerquelle kann man also leicht ausschliessen.

    Die Vorsilbe `my` ist in 99,9% der Fälle einfach nur sinnfrei. Wenn es den gleichen Namen nicht auch mit `our` oder `their` als Abgrenzung gibt, was soll das dann bedeuten?

    Die `close()`-Methode vom Kamera-Objekt wird nicht aufgerufen. `PiCamera`-Objekte kann man mit ``with`` verwenden, damit die Ressource garantiert wieder freigegeben wird wenn der Programmfluss den ``with``-Block verlässt.

    Das `stop_preview()` will man nicht nur wenn der Benutzer das Programm mit Strg+C abbricht, sondern immer wenn das Programm endet. Wobei ich vermute, dass das auch im `close()` mit enthalten wäre.

    Funktionen sollte in sich geschlossene Aufgaben erledigen, die man einzeln testen kann. Das `imager()` am Ende `pdfpage()` aufruft ist da ungünstig weil man die beiden Funktionen dadurch nicht mehr leicht einzeln testen kann.

    Werte mit ``%`` in Zeichenketten formatieren würde ich nicht mehr ohne guten Grund machen. Es gibt die `format()`-Methode dafür.

    Ungetesteter Zwischenstand:

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • Danke an Alle für die schnellen und hilfreichen Antworten!!!

    koelnpub Tonny legt soweit ich weiss virtuelle Umgebungen („venvs“) pro Projekt an, in die Packages installiert werden. Die werden zum Beispiel im Tutorial in der Python-Dokumentation gegen Ende behandelt.

    Edit: Bei dem Quelltext fehlen sämtliche Einrückungen.

    Ich denke, das ist genau die Richtung, in die ich schauen muss. Die Quelltexteinrückungen sind wohl beim copy/paste verloren gegangen.

    Gibt es einen besonderen Grund das Skript mit sudo aufzurufen? Was passiert, wenn Du das weglässt?

    Wozu "sudo" im Terminal ?

    Du verwendest Thonny doch auch als User pi.

    Und in der ersten Zeile Deines Scripts sollte ein Shebang auf Python3 zeigen.

    Das FPDF hast Du als Python3 Modul installiert ?

    Servus !

    Genau das war's! Ohne sudo läuft es. Als User pi bewege ich mich offensichtlichin der gleichen virtuellen Umgebung die auch Thonny nutzt. Das scheint als root wohl nicht der Fall zu sein.

  • Irgendwie fühle ich mich beschimpft.

    Das sehe ich auch so, aber m.M.n. unberechtigt.

    Das größte Problem liegt nicht bei Dir, sondern bei den vielen veralteten und z.T. fragwürdigen Tutorials, die gerade im Bereich Raspberry Pi, im Netz zu finden sind. Kaum hat jemand herausgefunden wie man ein "Hallo Welt" am Terminal ausgibt oder mit einen Taster am RPi eine LED zum leuchten bringt, wird ein Video auf yt erstellt oder ein Tutorial im eigenen Blog gepostet und das ohne Rücksichtnahme auf Systemrechte, Benutzer oder Gruppen im verwendeten OS. (Es gibt noch ein paar andere gravierende Fehler die gerne gepostet werden, ich sage nur rpi-update. :shy:) Beginner denken dann das stetige Verwenden von sudo wäre völlig normal, kein Wunder.

    Eins müssen wir hier aber festhalten: Das Modul hast Du richtig, also ohne sudo, installiert! ;)

Jetzt mitmachen!

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