Seite 1 von 1
Probleme bei einer String Zusammensetzung
Verfasst: Donnerstag 3. Januar 2019, 14:01
von Cino
Ich versuche gerade das Grungerüst aufzubauen, damit ich später damit arbeiten kann.
Ich habe eine Curl Anweisung die ich aufsplitten und dann wieder zusammensetzen will.
Leider habe ich einen Syntax Fehler. Es ist mein erster Gehversuch, habe mir schon viel per Google zusammengesucht, jetzt brauche ich aber menschliche Hilfe.
Code: Alles auswählen
import os
ip = "http://192.168.0.192"
port = 56789
url = "/apps/SmartCenter"
key = 1012
cmd1 = "curl -X POST -d '<remote><key code="
cmd2 = "/></remote>'"
ipstrng = %s%s%s %s:%s%s' % (cmd1, key, cmd2, ip, port, url)
#test = "curl -X POST -d '<remote><key code=1012/></remote>' http://192.168.0.192:56789/apps/SmartCenter"
print (ipstrng)
#os.system(ipstrng)
Re: Probleme bei einer String Zusammensetzung
Verfasst: Donnerstag 3. Januar 2019, 14:06
von sparrow
Welche Python Version verwendest du?
Du solltest
.format() auf Zeichenketten verwenden, um Variablen darin zu setzen.
Ich sehe in der Zeile, in der du eine Zeichenkette an den Namen "ipstrng" binden möchtest, nicht wo die Zeichenkette beginnt. Kann man hier bei dem Systaxhighlighting auch gut erkennen.
Edit: Übrigens hilft es allen (vor allem dir) weiter, wenn du Variablen gut und lesbar benennst. So ein verlorenes "i" in "string" wird dann schon einmal zum Stolperstein. Und "command" wäre richtig aussagekräftig.
Re: Probleme bei einer String Zusammensetzung
Verfasst: Donnerstag 3. Januar 2019, 14:17
von Sirius3
Wenn Du curl verwenden willst, nimm pycurl. Ansonsten macht man das eher mit reinem Python per `requests`-modul. Konstante Strings per %s zusammenzusetzen, ist sehr unleserlich. XML baut man normalerweise nicht selbst, sondern benutzt z.B. ElementTree.
`ip` ist keine IP-Adresse sondern eine URL.
Code: Alles auswählen
import xml.etree.ElementTree as et
import requests
URL = "http://192.168.0.192:56789/apps/SmartCenter"
KEY = 1012
remote = et.Element('remote')
et.SubElement(remote, 'key', code=str(KEY))
result = requests.post(URL, data=et.tostring(remote))
Re: Probleme bei einer String Zusammensetzung
Verfasst: Donnerstag 3. Januar 2019, 14:17
von Cino
Hallöchen es hat ein ' am string gefehlt. ipstrng = '%s%s%s %s:%s%s' % (cmd1, key, cmd2, ip, port, url)
Die Abkürzungen sind angewohnheiten von der Arbeit aus.
Um zu erklären was ich hier mache. Mit dem Curl kann ich meinen Fernseher steuern. Ich muss nur den Keycode ändern.
Ich hatte es erst mit request versucht, was aber bei mir nicht klappte. Deswegen bin ich jetzt auf os umgestiegen.
Jetzt beendet sich das natürlich alles. Habe etwas von subprocess und call gelesen. Muss mich da jetzt reinlesen.
Ich möchte eine Fernbedienung nachbauen, damit ich ein Ziel beim lernen habe.
Re: Probleme bei einer String Zusammensetzung
Verfasst: Donnerstag 3. Januar 2019, 14:54
von __blackjack__
@Cino: Bei aktuellen Python 3-Versionen eher `subprocess.run()` statt `call()`. Das steht da dann aber auch in der Dokumentation. Aber letztendlich braucht man da keine externen Programme für, das kann man auch in Python lösen.
Re: Probleme bei einer String Zusammensetzung
Verfasst: Donnerstag 3. Januar 2019, 16:13
von Cino
Mit dem hier habe ich es versucht.
process = subprocess.Popen( ipstrng, shell=True, stdout=subprocess.PIPE)
print process.stdout.read()
Re: Probleme bei einer String Zusammensetzung
Verfasst: Donnerstag 3. Januar 2019, 16:16
von __deets__
Du solltest wirklich mit requests arbeiten. Das funktioniert garantiert, wenn du damit Probleme hast, ist es zielfuehrender diese Probleme zu loesen statt dich mit den Komplikationen von subprocess rumzuschlagen.
Re: Probleme bei einer String Zusammensetzung
Verfasst: Donnerstag 3. Januar 2019, 16:49
von __blackjack__
@Cino: Und wenn `subprocess` dann nicht mit ``shell=True`` und einer Zeichenkette. Dann hat das so gut wie keinen Vorteil gegenüber `os.system()`.
Re: Probleme bei einer String Zusammensetzung
Verfasst: Freitag 4. Januar 2019, 00:36
von Cino
Ich habe es so verstanden, das mit os.system der ganze Prozess gekillt wird nach Aufruf und mit dem subprocess alles noch weiterläuft.
Mit dem request hatte bei mir nicht geklappt, ich habe einen Online Dienst benutzt gehabt der mir die Curl Anweisung in was pt verständliches umwandelt. Klappte nicht, vielleicht auch deswegen weil ich es auf Windows benutzt habe.
Das Programm läuft unter dem PI ohne Probleme, bei Windows habe ich schon wieder Syntaxprobleme im Terminal. Ich werde es bei gegebener Zeit mal mit dem request direkt auf dem PI probieren.