Wie sage ich es in Python ? (Einsteigerfragen)

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo,

    ich habe einen „Klopfschalter“ der mittels Schallsensor ein Relais schaltet und gut funktioniert. Nun möchte ich aber, dass er nur auf 2x klopfen innerhalb einer bestimmten Zeit reagiert.

    Hier nun meine Frage zu „Wie sage ich es in Python“:

    Warte darauf, dass der GPIO24 zweimal HIGH innerhalb von 1,5 sek ist, wenn das erfüllt ist, dann schreibe SUPER.

    LG Lubi99

  • Hallo,

    Lubi99: im gegebenen Fall reicht ja wirklich ein Unix-Timestamp, den bekommst du mit dem `time` Modul. Da du ja nicht mit einem konkretem Datum oder Uhrzeiten rechnen musst, brauchst du (das ansonsten zu bevorzugten) `datetime` Modul nicht.

    Wenn du nicht weiter kommst am besten einen eigenen Thread zu deinem Problem starten.

    Gruß, noisefloor

  • Mahlzeit zusammen,

    ich bin absoluter Anfänger und habe die Tage angefangen mich mit Python zu beschäftigen.

    Ich wollte erstmal die kostenlosen Angebote im Netz probieren/durcharbeiten und habe als erstes mit python-kurs.eu angefangen.
    Ziemlich trocken erstmal.
    Auf jeden Fall bin ich gerade bei dem Kapitel/der Seite über Dictionarys und habe das erste mal nen richtiges Fragezeichen über dem Kopf.

    Auf der Seite ist ein Beispiel für ein Dictionary mit dem Morsealphabet, welches man sich als morsecode.py speichern soll.
    Also habe ich dies getan unter ~/Python/morsecode.py
    Dann soll man mit

    Python
    from morsecode import morse

    den Dictionary wohl importieren und als nächstes mit

    Code
    >>> len(morse)

    abfragen wie viele Zeichen darin gespeichert werden.
    ABER

    Wenn ich "from morsecode import morse eingebe, bekomme ich folgende Fehlermeldung:

    Code
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    ModuleNotFoundError: No module named 'morsecode'

    Was mache ich falsch?

    Gruß und Danke

    Mario

    • Offizieller Beitrag

    Du hast deine Virtuelle Console bestimmt von~ geöffnet und nicht von ~/Python. Sprich er findet deine Datei nicht. Du kannst die "eine" Zeile auch stumpf in deine Console kopieren. Dann brauchst du dich (noch) nicht mit den "verwirrenden" Imports auseinandersetzen.

  • Hallo,

    Fehler Nr. 1 ist, dass du python-kurs.eu liest. Die Seite zeigt an vielen Stellen suboptimales bis falsches (im Sinne von nicht-idomatisches) Python und ist von daher _nicht_ zu empfehlen. Wenn du ein gutes Tutorial lesen möchtest, dann nimm' das aus der offiziellen Python Doku (https://docs.python.org/3.5/tutorial/index.html). Vergiß' am besten, dass es python-kurs.eu gibt.

    Zum Fehler: der Import funktioniert nur dann, wenn sich `morsecode.py` in einem Verzeichnis befindet, die standardmäßig von Python nach Modulen abgesucht werden. Das sind ein paar Sytemverzeichnisse (Pfade können je nach OS variieren) und das Verzeichnis, aus dem Python aufgerufen wurde. Spricht:

    Code
    cd ~/Python
    python3

    und dann from morsecode import morse sollte funktionieren.

    Gruß, noisefloor

  • dbv

    Klar, hab die Konsole im ~ geöffnet.
    Wenn nicht anders beschrieben mach ich das immer so. (Bin halt noch Neuling bei Linux)

    noisefloor

    Danke für den Hinweis. Dann werde ich es mit dem Kurs auf jeden Fall lassen.
    Hatte eigentlich gehofft, dass der was ist, da die/der ja auch ein Buch verkauft etc.

    Ich hatte ansonsten aktuell noch

    https://wiki.python.org/moin/GermanLanguage

    und

    https://media.readthedocs.org/pdf/py-tutoria…tutorial-de.pdf

    auf der ToDoListe

  • Mittelfristig solltest du dich aber damit anfreunden, englische Doku zu lesen. Das ist nun mal der Standard.

    Speziell wenn Du irgendwelche Fehlermeldungen bekommst und nach Lösungen suchst bist Du wesentlich schneller fündig wenn Du die englischen (Fehler)Meldungen und Python Begriffe benutzt. Wenn es mit Englisch nicht so gut bestellt ist starte mit deutschen Tutorials. Aber ich empfehle wie noisefloor - auch wenn es zuerst mühsam ist - später auf englische Tuts umzusteigen.

  • framp  noisefloor Klar, mein Englisch ist etwas eingerostet. Texte aus Fachliteratur sind im Moment etwas anstrengend für mich.
    Aber das werde ich eh ab Januar mit aufpolieren müssen, da ich am 15.Jan. eine Umschulung zum FiSi starte. Aber da hab ich dann auch begleitend passenden Englischunterricht.
    Jetzt will ich hier aber nicht weiter OT werden und solange der Kleene noch im KiGa ist die Ruhe nutzen und mich der Dokumentation weiter nutzen.
    Die Py-Tutorial-pdf ist auf jeden Fall auch schon mal ansprechender geschrieben und interaktiver als Python-Kurs.eu

    Besten Dank und Gruß
    Mario

  • Mahlzeit,

    und wieder hänge ich am Anfang einer Doku fest.
    Ich bin gerade bei https://media.readthedocs.org/pdf/py-tutoria…tutorial-de.pdf auf Seite 18 "Erste Schritte zur Programmierung"

    Wenn ich das eingebe was da vorgegeben ist bekomme ich beim print-Befehl einen Fehler, kann aber gerade nicht nachvollziehen wieso.

    Hatte irgendwie gehofft nicht so schnell Fehler zu produzieren....

    Was mache ich hier schon wieder falsch? Hab ja lediglich die Kommentare aus der Anleitung nicht eingegeben.

    Gruß Mario

  • ~ wird von den meisten Shells als HOME interpretiert... Jeder Benutzer hat ein "Home Directory", wo seine eigenen Dateien liegen und er auch landet wenn er sich anmeldet.

    HOME gehört auch zur Benutzer-Umgebung, also Standard Variablen die für die Umgebung der Benutzershell verwendet werden... Abrufbar über den Befehl env. Dort findet sich auch eine Variable PATH wieder, die mit Trennzeichen : verschiedene Verzeichnisse enthält in denen nach Befehlen gesucht wird. Wenn du nämlich zB den Befehl ls eingibst wird in eben diesen PATH Verzeichnissen nach dem Befehl gesucht. Genau dieser Umstand kommt auch bei Python zur Geltung, wobei Python eine eigene Umgebung hat: PYTHONPATH.

    Wenn man ein Script importiert wird die Umgebungsvariable PYTHONPATH zur Rate gezogen und in diesen Verzeichnissen nach der Datei/Module gesucht... Zusätzlich aber auch in dem aktuellen Verzeichnis - wenn du dich aktuell im Verzeichnis /home/pi/Python/ befindest sucht er also auch dort.

    Befindest du dich aber in /home/pi/ und möchtest eine Datei aus /home/pi/Python/ importieren sucht er da nicht von alleine.. Um das zu erreichen gibt es (wie immer) mehrere Möglichkeiten:

    1) In dem Script wo die import Zeile steht, Einfluss auf die path Umgebung nehmen:

    Python
    import sys
    sys.path.append("/home/pi/Python")
    from morsecode import morse

    2) Im Unterverzeichnis zusätzlich eine leere __init__.py Datei erzeugen... Siehe dazu https://docs.python.org/3/tutorial/modules.html#packages

    Und dann den relativen Pfad angeben ausgehend vom aktuellen, wobei nicht / genutzt werden sondern .

    ...oder wie schon vorgeschlagen wurde, erst in das jeweilige Verzeichnis wechseln bevor die Python-Konsole geöffnet wird...


    PS: Dieser Thread hier ist eigentlich nur dazu gedacht kurze Anliegen zu erläutern. Wenn du aber allgemein Probleme hast oder öfter oder die Klärung länger dauert, wäre es besser ihr erstellt einen eigenen Thread. Denn wenn hier einfach _alle_ Python relevanten Sachen behandelt werden bräuchten wir kein Forum mehr...

  • Was mache ich hier schon wieder falsch?

    Steht doch da:

    Code
    IndentationError: expected an indented block
        >>>

    Im Gegensatz zu fast allen anderen Programmiersprachen ist in Python die Einrückung Teil der Syntax! Statt wie in anderen Programmiersprachen sowas wie "end if", "wend" (etc.) das Ende einer Schleife zu benutzen, bestimmt die Einrücktiefe, was zu einer Schleife gehört und was nicht.

    Python erwartet nach dem "While"-Befehl eine Schleife, stattdessen schreibst du direkt in derselben Einrücktiefe weiter. Das merkt Python, deshalb bekommst du auch einen IdentationError geworfen...

  • Steht doch da:

    Das ist etwas sehr tolles, wie ich finde. Die Fehlermeldungen sind (fast) immer sehr deutlich.

    bestimmt die Einrücktiefe

    Und hier nimmst du bitte Vielfache von 4 Leerzeichen und nichts anderes. Nicht drei, nicht zwei, keine Tabs, nichts mischen. Wichtig.

    Python erwartet nach dem "While"-Befehl eine Schleife

    So würde ich das nicht nennen... Eher Python erwartet nach dem Schlüsselwort while einen beliebigen Codeblock, der durch eine Ausrückung beendet wird. Dieser wird so oft durchlaufen, wie der Wahrheitsvergleich der Schleife True ergibt. Auf Deutsch klingt das alles so bescheuert...

  • Steht doch da:

    Code
    IndentationError: expected an indented block
        >>>

    Im Gegensatz zu fast allen anderen Programmiersprachen ist in Python die Einrückung Teil der Syntax! Statt wie in anderen Programmiersprachen sowas wie "end if", "wend" (etc.) das Ende einer Schleife zu benutzen, bestimmt die Einrücktiefe, was zu einer Schleife gehört und was nicht.

    Python erwartet nach dem "While"-Befehl eine Schleife, stattdessen schreibst du direkt in derselben Einrücktiefe weiter. Das merkt Python, deshalb bekommst du auch einen IdentationError geworfen...

    Ahhh... jetzt wo Du es schreibst hab ich bei genauerer Betrachtung auch gesehen, dass zwischen dem ... und dem print einige Leerzeichen sind.
    Danke.
    Und ja, dass mit dem Einrücken hatte ich schon mal gelesen, aber hier irgendwie nicht beachtet.

    Und hier nimmst du bitte Vielfache von 4 Leerzeichen und nichts anderes. Nicht drei, nicht zwei, keine Tabs, nichts mischen. Wichtig.

    Hat das mit dem vier Leerzeichen einen technischen Grund oder dient das eher der verallgemeinerten Übersicht des Code?

  • Hat das mit dem vier Leerzeichen einen technischen Grund oder dient das eher der verallgemeinerten Übersicht des Code?

    Technisch ist es egal, die erste auftretende Einrückung wird für das ganze File genommen. Aber es ist ein anerkannter Standard mit den vier Leerzeichen, schau dir mal PEP8 (https://www.python.org/dev/peps/pep-0008/) an. Jeder halbwegs gescheite Editor kann dir einen Druck auf <Tab> in vier Leerzeichen verwandeln, bei drei Ebenen Einrückung musst du nicht zwölf Leerzeichen abzählen ;)

Jetzt mitmachen!

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