Probleme bei einer String Zusammensetzung

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
Cino
User
Beiträge: 5
Registriert: Freitag 4. September 2015, 14:33

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)
Benutzeravatar
sparrow
User
Beiträge: 4537
Registriert: Freitag 17. April 2009, 10:28

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.
Sirius3
User
Beiträge: 18268
Registriert: Sonntag 21. Oktober 2012, 17:20

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))
Zuletzt geändert von Sirius3 am Donnerstag 3. Januar 2019, 14:19, insgesamt 2-mal geändert.
Cino
User
Beiträge: 5
Registriert: Freitag 4. September 2015, 14:33

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.
Benutzeravatar
__blackjack__
User
Beiträge: 14036
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Cino
User
Beiträge: 5
Registriert: Freitag 4. September 2015, 14:33

Mit dem hier habe ich es versucht.

process = subprocess.Popen( ipstrng, shell=True, stdout=subprocess.PIPE)
print process.stdout.read()
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
__blackjack__
User
Beiträge: 14036
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Cino: Und wenn `subprocess` dann nicht mit ``shell=True`` und einer Zeichenkette. Dann hat das so gut wie keinen Vorteil gegenüber `os.system()`.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Cino
User
Beiträge: 5
Registriert: Freitag 4. September 2015, 14:33

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.
Antworten