Raspberry Python Frage

Hallo,

ich habe ein kleines Problem, das meiner totalen Unwissenheit geschuldet ist.
Ich sende per UDP ein Wort an den Raspberry, dass dann von einem kleinen Python Skript angenommen wird und damit einen Befehl ausführen soll.

Was nicht funktioniert ist die if Bedingung, ich weiß echt nicht mehr, was ich noch ausprobieren soll.
Hier erstmal der Output, ich habe mir die Übergabe ausgeben lassen um festzustellen, dass überhaupt etwas ankommt:

pi@raspberrypi:~/musik $ ./audioscript.py
Message1: Klingel
Message1: Waschmaschine

Und hier das Skriptchen (ohne das ‚-‘).

-#!/usr/bin/python

import socket
import os
import subprocess

UDP_IP_ADDRESS = „192.168.2.75“
UDP_PORT_NO = 65000

Sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Sock.bind((UDP_IP_ADDRESS, UDP_PORT_NO))

while True:
data, addr = Sock.recvfrom(1024)
print "Message1: ", data
if data == ‚Klingel‘ :
subprocess.Popen(‚mpg321 /home/pi/musik/sonar.mp3‘)
elif data == ‚Waschmaschine‘ :
subprocess.Popen(‚mpg321 /home/pi/musik/sonar2.mp3‘)

ich habe auch schon nur ein Print an die Stelle des subprocess.Popen gesetzt, es ist der IF-Vergleich, der nicht funktioniert.
Ich habs mit Zahlen, Doppelten Hochkomma, ohne Hochkomma versucht, Dem Skript mitgegeben, welchen Zeichensatz es nehmen soll, es alles mit upper() formatiert……

Was mache ich für einen Fehler?

Ich freue mich auf eure Antwort.

Grüße

Chris

Hallo,

ich hatte auch noch anderweitig gefragt,
anscheinend ist an dem Code-Gullasch einiges nicht in Ordnung. Anscheinend nutze ich veraltetes Python und das funktioniert deshalb alles nicht, weil irgendwas mittlerweile andere Eingangstypen erwartet oder so - ich hab schon die Antworten kaum verstanden.
Da ich, wie schon umschrieben, keine Ahnung von Python habe und ich nur dieses eine Skript brauche, suche ich mir im RL jemanden, der mir das einfach richtig schreibt.

Danke und Grüße

Chris

Hallo!

Wenn das print "Message1: ",data funktioniert, die IF-Anweisung aber nicht, dann vermute ich ganz stark, daß du nicht das empfängst, was du zu empfangen glaubst. Ich vermute, daß hinter dem Wort Klingel noch ein Zeilenumbruch oder so kommt.

Füge folgendes am Ende an:

else:
    print "Unbekanntes Kommando: '"+repr(data)+"'"

Vermutlich bekommst du dann folgendes angezeigt:

Unbekanntes Kommando:'Klingel\n'

Das
\n ist eben ein Zeilenumbruch, den man so meist nicht sieht.

Lösung: Nach dem Sock.Recvfrom eine neue Zeile mit

data=data.strip()

Das löscht am Anfang und am Ende von data alle Whitespaces, das heißt, alles, was kein sichtbares Zeichen ist (Leerzeichen, Tabulator, Zeilenumbruch,…)


Und dann stimmt der Aufruf von subprocess.Popen nicht. Es muß heißen:

subprocess.Popen(['mpg321', '/home/pi/musik/sonar.mp3'])

Davon abgesehen gibt es seit Jahren Python 3, aber Python 2 will einfach nicht sterben, einfach, weil es viel zu viel Python-Scripte für Python2 gibt, und viele nicht zu 3 wechseln wollen.

Einer der ersten Unterschiede:

Python2:   print "Hello World"
Python3:   print("Hello World")

Du schreibst also in Python2, mit python3 würde dein Script gar nicht laufen. Aber da dein Script läuft, ist ja alles in Ordnung! Du könntest die erste Zeile höchstens so abändern, um Python2 zu erzwingen:

#!/usr/bin/python2

Und dann stimmt der Aufruf von subprocess.Popen nicht. Es muß heißen:

subprocess.Popen(['mpg321', '/home/pi/musik/sonar.mp3'])

Also:

  • Ändere die Subprocess-Zeilen
  • Füge den else-Case ein
  • Benutze die strip-Methode

dann sollte es laufen.

Hallo sweber,

vielen Dank für deine Antwort!
Wenn ich wieder einen Rechner unter den Fingern und den Raspberry an habe, werde ich deine Zeilen einbauen.
Jetzt weiss ich auch woran man die Python Version in dem Skript erkennt. Wahrscheinlich habe ich auch bei meiner Suche im Netz nur alte Seiten gefunden, aber ohne Grundwissen fällt einem das auch nicht auf :smiley:

Grüße

Chris

Hallo!

Zur Python-Version nur noch so viel:

Das print "hello world" ist syntakisch unsauber, da print eigenlich eine Funktion ist, und demnach ein Argument in Klammern übergeben bekommen sollte. Genau das wurde in Python3 geändert, da sind die Klammern Pflicht.

ABER Python2 wird auch weiter entwickelt, eben, weil man es nicht los wird, und die letzten Versionen nähern sich Python3 an. Das heißt, auch Python2 (ab Version 2.6 oder 2.7) versteht print("hello world"). Vollständig kompatibel ist es immernoch nicht, aber die pure Anwesenheit von Klammern sagt nicht direkt aus, daß das ganze wirklich Python3 ist. Die Abwesenheit diktiert aber Python2.

Ansonsten gibt es noch einige andere Unterschiede, aber das mit dem print ist der offensichtlichste, da fast jedes Script das enthält.

Und weil es ungefähr doppelt so schnell ist.

Das glaub ich nicht.

Ok, doppelt stimmt nicht.
Aber lies mal:
https://hackernoon.com/which-is-the-fastest-version-of-python-2ae7c61a6b2b
oder
http://ptrace.fefe.de/wp/timings2019.txt