commands.getoutput SyntaxError ?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
pesucofa
User
Beiträge: 3
Registriert: Freitag 2. Mai 2014, 19:55

Hallo liebe User !

Zu Ostern habe ich mir einen Raspberry Pi zugelegt.
Ich bin leider ein Anfänger in Pyton.

Ich schreibe mir gerade ein Script das mir die CPU Temperatur in die Mysql Datenbank schreibt.
Hier gibt es den Befehl: /opt/vc/bin/vcgencmd measure_temp und dieser bringt mir temp=49.8'C

Nur muss ich aber einen Zahlenwert in die Mysql Datenbank schreiben und deshalb habe ich den Befehl umgebaut.

/opt/vc/bin/vcgencmd measure_temp | cut -d "=" -f2 | cut -d "C" -f1 | cut -d "'" -f1 bringt mir nun

49.8 das würde nun passen. Nun zum Problem. Im Pytonscript verwende ich folgende Zeile.

mytemp = commands.getoutput('/opt/vc/bin/vcgencmd measure_temp | cut -d "=" -f2 | cut -d "C" -f1 | cut -d "'" -f1')

Und hier kommt es zum Fehler:
SyntaxError: ('EOL while scanning string literal', ('CPUinDB.py', 13, 117, ' mytemp1 = commands.getoutput(\'/opt/vc/bin/vcgencmd measure_temp | cut -d "=" -f2 | cut -d "C" -f1 | cut -d "\'" -f1\')\n'))

Wer kann hier helfen ?

Schones Wochenende und ich würde mich freuen wenn da jemand einen Tip hat, oder das ganze anders lösen ?
Die Ausgabe kommt immer mit temp=49.8'C und hier darf ich nur den Zahlenwert 49.8 in die Mysqldatenbank schreiben !
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

pesucofa hat geschrieben:mytemp = commands.getoutput('/opt/vc/bin/vcgencmd measure_temp | cut -d "=" -f2 | cut -d "C" -f1 | cut -d "'" -f1')

Und hier kommt es zum Fehler:
SyntaxError: ('EOL while scanning string literal', ('CPUinDB.py', 13, 117, ' mytemp1 = commands.getoutput(\'/opt/vc/bin/vcgencmd measure_temp | cut -d "=" -f2 | cut -d "C" -f1 | cut -d "\'" -f1\')\n'))
Deine Stringbegrenzer sind einfache Hochkommas. Das ist prima, wenn du doppelte Hochkommas im String haben willst und du hast sie ja auch tatsächlich darin. Dein Problem ist, dass du im String auch ein einfaches Hochkomma hast (bei cut -d "'"). Das geht jetzt so nicht, da Python natürlich annimmt, dass an der Stelle der String zuende sei und mit dem Rest nichts mehr anfangen kann. Es gibt zwei mögliche Lösungen dafür. Entweder verwendest du im String \' wenn du ein einzelnes Hochkomma benötigst (das sogenannte Escaping) oder du schließt den kompletten String in dreifache Stringbegrenzer ein:

Code: Alles auswählen

mytemp = commands.getoutput("""/opt/vc/bin/vcgencmd measure_temp | cut -d "=" -f2 | cut -d "C" -f1 | cut -d "'" -f1""")
BlackJack

@pesucofa: Wobei sich die Frage stellt wieso das `commands`-Modul verwendet wird, und warum überhaupt so viel mit Shell-Kommandos gemacht wird, was man auch mit Python lösen könnte. Das erste was in der Dokumentation zu dem Modul steht, ist das es seit Python 2.6 „deprecated” ist und man das `subprocess`-Modul verwenden sollte.
pesucofa
User
Beiträge: 3
Registriert: Freitag 2. Mai 2014, 19:55

Vielen Dank an /me

Ich bin leider ein absoluter Pyton Neuling und kenne das Problem auch bei VBA in Excel mit den Hochkommas.

Ich wusste nur nicht wie man das in Pyton umgeht, jetzt durch die ausfühliche Antwort von /me schon.

Zu BlackJack kann ich nur sagen das ich nicht verstehe was man meint da Pyton für mich neu ist.
Ich habe beim Raspi zwei Möglichkeiten die Cpu Temperatur auszulesen.
vcgencmd measure_temp ergibt temp=49.8'C
cat /sys/class/thermal/thermal_zone0/temp ergibt 49821 und hier muss ich alles noch umwandeln das ich hier 49.8 als Zahlenwert bekomme.

Wie man das in Pyton auslesen kann ohne `commands`-Modul weiss ich leider nicht und wäre über einen Tip dankbar.

Nochmal danke für die schnellen Antworten und ich werde hier nun öfter reinschauen.

Gruss pesucofa :D
BlackJack

@pesucofa: Die Frage wieso Du das `commands`-Modul verwendest stellt sich doch sogar noch mehr wenn Python neu für Dich ist. Zum starten von externen Programmen, und dem Auslesen von dem was die so ausgeben ist das `subprocess`-Modul das Mittel der Wahl. Das habe ich doch schon geschrieben und das steht auch in der Dokumentation zum `commands`-Modul. So ziemlich als erstes und rot hinterlegt, damit man es nicht übersieht.

Die grundlegenden Zeichenkettenoperationen sollten Grundlagentutorials eigentlich abdecken. Zusätzlich lohnt es sich auch in die Dokumentation zu Sequenztypen allgemein und Zeichenketten im besonderen zu schauen, was es da an Operationen und Methoden gibt. Nur um einen Zeil von einer Zeichenkette auszuschneiden ist das starten von drei zusätzliche externen Prozessen etwas übertrieben.

Das Auslesen der Datei unter ``/sys/…`` würde sogar ohne das starten eines zusätzlichen externen Prozesses auskommen.
pesucofa
User
Beiträge: 3
Registriert: Freitag 2. Mai 2014, 19:55

:oops: Habs gefunden die Dokumentation !

Gibt es das auch in Deutsch, mein Englisch ist bescheiden - leider.
Irgendwie steht da was von Bahnhof und so für mich drin ?
Gruss pesucofa :)
BlackJack

Zu dem Thema gibt's hier im Forum „It's english, get over it”.

Unterm Strich: Niemand macht sich heute mehr die Mühe Dokumentation zu übersetzen. Aber technisches Englisch ist auch nicht sooo schwer.
Antworten