Problem bei einer IF-Schleife

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

    Ich lasse mir durchs auslesen der URL, ein Radiosender-Namen anzeigen (den ich vorher festgelegt habe). Dies klappt soweit wunderbar. Stoppe ich aber den MPC/MPD wird nichts mehr angezeigt. Irgendwie auch klar! Ich möchte allerdings, dass dann so etwas wie "Kein Sender" steht.
    Zur Verdeutlichung hier ein kleiner Code-Schnipsel:

    Wäre schön wenn jemand einen Tipp für mich hat!


  • Wird es durch deine for-Schleife nicht unmöglich, dass pfad = "" bleibt? Oder bin ich grad blöd? :s

    Code
    for i in x.readlines():
         pfad += i

    Ich sehe das auch so, der pfad wird immer länger, respektive enthält am Ende alle Zeilen des Files

    Was ich jetzt nich grad weiss ist ob das /n im String wirklich enthalten ist oder es durch readfile ersetzt wird. Ich würde nicht darauf vergleichen.

    Einmal editiert, zuletzt von ZapX (4. Januar 2014 um 15:17)

  • Ich denke so wäre es besser:


    Muss aber dazu sagen das ich von Python kein Plan hab, also im Voraus sorry wenn auch das nicht funktionieren sollte :blush:

  • Ich würde das über ein Dictionary machen. Alle URLs incl deren Sendernamen in ein Dictionary und dann einen Test ob es ein leerer String ist. Dann den 'Kein Sender' benutzen und ansonsten in dem Dictionary nachsehen. Falls der Name im Dictionary nicht gefunden wird ist es der Hostname (default)

  • Erst einmal vielen Dank für eure Antworten!

    @ Chris und Zap:
    Ich habe die Zeile mit " Pfad += i " auch schon ohne "+" versucht. Leider ohne Erfolg. Wenn ich euch richtig verstanden habe?!

    @ Meigrafd:
    Dein Schnipsel hab ich getestet. Allerdings bekomme ich auch nur eine Anzeige, wenn ein Sender grad aktiv läuft. Sobald der MPC gestoppt ist, wird nichts ausgegeben.

    @ Framp:
    Dein Schnipsel fand ich interessant wie auch (für mich) verwirrend ;). Leider aber auch mit dem selben Ergebnis, das nichts angezeigt wird sobald der MPC gestoppt ist bzw. es keinen Pfad gibt. Ich habe auch nochmal zusätzlich in der "sender" Variable ein " "": 'kein Sender' " hinzugefügt. Hat aber auch nichts gebracht....

    Ich verstehe nicht, warum die "leere" Variable nicht übernommen wird ?
    Es ist ja klar das es keinen Pfad gibt, wenn der MPC gestoppt ist! Aber wenn das Ergebnis "leer", "0", "empty", "" oder was auch immer ist muss das die Schleife doch verstehen und der eigenen oder anderen Variable einen Wert bzw. Namen geben können/müssen?!

  • Hm ... das funktioniert, denn ich habe es bei mir dummymaessig gestestet. Leider weiss ich nicht was Du genau da in der Schleife zurückbekommst. Was liefert denn

    Code
    for url in x.readlines():
        print "Received: - %s -" % url


    ?

    Vielleicht kann ich Deine Verwirrung etwas lösen:

    Code
    sender = { "http://tuner.radiopaloma.de:80\n": 'Radio Paloma',
    
    
              "http://stream.antenne.com/hra-80er/mp3-128/IMDADevice/\n": 'Antenne 80s',
    
    
            "http://mp3channels.webradio.rockantenne.de:80/heavy-metal\n": 'Heavy Metal',
    
    
            "http://mp3.webradio.rockantenne.de:80\n": 'Rockantenne' }

    Damit wird ein Dictionary definiert, wo alle Sender URLs und ihre Sendernamen verknüpft werden.

    Code
    default = urlparse(url).netloc.split(':')[0] # hostname ohne port

    Dieser Code extrahiert den Hostnamen aus der URL um ihn anzuzeigen, wenn es keinen EIntrag in der obigen Liste gibt.

    Code
    senderName = noSender if url == "" else  sender.get(url, default)


    Damit wird nachgesehen ob es im Dictionary einen Eintrag gibt der die URL hat (get(url,default)). Wenn nix gefunden wird wid der Default zurückgeliefert. Der wurde vorher berechnet und ist der Hostname. Und falls die Url Leer ist wird der Inhalt von noSender (Kein Sender) genommen. Das kann man alles in einer Zeile erledigen in Python. Wenn man diese eine Zeile auseinanderzieht sieht das wie folgt aus:

    Code
    if url == "":
       senderName=noSender
    else:
       senderName=sender.get(url, default)
  • Danke, für deine Erklärung. Die Zeile "Default = urlparse(url)....." war mir neu bzw. unbekannt.

    Die Schleife liefert nichts zurück, wenn der MPC/MPD gestoppt ist. Läuft ein Sender wird der entsprechende Name angezeigt.


    Code
    for url in x.readlines():
        print "Received: - %s -" % url



    liefert die komplette URL zurück, wenn ein Sender grad läuft. Ist der MPC/MPD gestoppt wird ebenfalls nichts angezeigt. Hab dir mal einen Screenshot gemacht.

  • Jetzt habe ich Dein Problem verstanden: Es ist das Problem dass Du ein non blocking read auf der Pipe ausführen willst. Wenn Du die Suchmaschine Deines Vertrauens mit 'python subprocess pipe non blocking read' füllst wirst Du eine Menge Hits bekommen. U.a. habe ich dabei diesen Link gefunden der mir vielversprechend für Dich aussieht.

  • Mir ist eben übrigens aufgegangen dass das mit dem blocking bei Dir nix zu tun hat. Du brauchst einfach nur eine weitere äußere Endlosschleife und ein sleep damit Deine Pi nicht hohl dreht wenn der mpc aus ist.

    Code
    while True:   
       x=os.popen("mpc current -f [%file%]")
       for i in x.readlines():
          ...
       time.sleep(15)
  • Puh, da bin ich schonmal froh das es nicht das "non blocking read" ist. Das sah mir dann doch noch etwas komplizierter aus. Mit deiner weiteren äußeren Endlosschleife hab ich leider nur bedingt verstanden.
    Ich tue mich mit Python irgendwie sehr schwer. Auch das ganze einrücken nervt etwas. Aber das liegt wohl an den fehlenden Basic´s :s

    Bin allerdings auch ein Schritt weiter gekommen. Dieser Code funktioniert komischerweise:
    Der war doch fast identisch mit dem anderen oder ?

    Nun hab ich versucht diesen Schnipsel im eigentlichen Skript einzufügen und bekomme folgende Meldung wenn der MPC gestoppt ist. Wenn er läuft geht alles einwandfrei.

    Update:
    Glaub verstehe es einigermaßen. Ich hatte noch ein time.sleep/break aus kommentiert. Vielleicht liegt es daran?!


    P.S.:
    Vielleicht mag da nochmal jemand drüber schauen ? Blöd das man das eingerückte hier im Code nicht sieht...

    Einmal editiert, zuletzt von Nurox (5. Januar 2014 um 18:35)


  • ...Der war doch fast identisch mit dem anderen oder ?...
    Update:
    Glaub verstehe es einigermaßen. Ich hatte noch ein time.sleep/break aus kommentiert. Vielleicht liegt es daran?!


    Du hast eine weitere Loop drumrumgebaut und der Code ist nun anders - also genau das, was ich Dir vorgeschlagen habe. Nur auf syntaktisch anderem Wege. Den Sleep solltest Du drin lassen sonst wird Deine Pi bei ausgeschaltetem mpc hohldrehen.

    BTW: Wenn Du Dir meine Codesnippets ansiehst wirst Du feststellen, dass dort die Einrueckungen drin sind. Ohne die ist es fast unmöglich Pythoncode zu verstehen - ausser er ist so einfach wie bei Dir.

  • reicht ein time.sleep(x) oder muss der break auch drin bleiben ?
    Ich habe den Satz oben durchgestrichen, wo ich dachte zu verstehen. :blush:
    Ich muss mir wohl nochmal das ein oder andere durchlesen. Ich raff das noch nicht so ganz mit den Loops, breaks´s, time.sleep etc.
    Ich meine auch das ich mich damals bei "einfachem" PHP-Code nicht so schwer getan habe. Fand ich etwas leichter. Kann aber auch nur Spinnerei sein ?!

    Genauso will es mir nicht in den Kopf warum das erste Skript von meinem vorletzten Post auf einmal ging? Da ist doch nichts drin von einer Außenschleife (while True: -> time.sleep())?!
    Oder verwechsle ich da grad irgendwas?

    Trotzdem wollt ich dir Framp, nochmal besten Dank sagen das mir hier etwas unter die Arme greifst...


  • reicht ein time.sleep(x) oder muss der break auch drin bleiben ?

    Code
    time.sleep(sleeptime)


    reicht.

    Zitat


    ...Ich muss mir wohl nochmal das ein oder andere durchlesen. Ich raff das noch nicht so ganz mit den Loops, breaks´s, time.sleep etc.


    Jupp, empfehle ich Dir auch. Das sind die Grundlagen in einer Programmiersprache. Diese Seite sollte Dir dabei helfen.

    Zitat


    ...Trotzdem wollt ich dir Framp, nochmal besten Dank sagen das mir hier etwas unter die Arme greifst...

    Kannst mir ja eine Bewertung geben wenn Du willst :)

  • Werd mir den Link merken und da mal etwas drin stöbern, Danke.

    Ich hab es mittlerweile hinbekommen. Kannst dir ja nochmal anschauen. Auch für andere ist der Schnipsel eventuell brauchbar?! Jedenfalls wird alles so angezeigt wie es soll und wenn der MPC gestoppt ist, steht "Kein Sender" im Display.

    Hab es mal als Screenshot gemacht, damit es ordentlicher aussieht ;)

    Einmal editiert, zuletzt von Nurox (5. Januar 2014 um 20:40)

Jetzt mitmachen!

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