subprocess.call Ausgabe trennen

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
peddy
User
Beiträge: 121
Registriert: Montag 30. Juni 2008, 13:51

Hallo,

ich möchte die Ausgabe von subprocess.call zur Auswertung in mehrere Elemente aufteilen. Ich würde dafür gerne die Funktion str.split() verwenden, aber leider funktioniert das nicht wie erwartet.

Hier der Code:

Code: Alles auswählen

#!/usr/bin/env python

# Module laden
import subprocess

# Variablen definieren
SERVER = "svkol"
PORT = "31003"
IK = "105823040"
PARAMETER = "004b@-5envvvtg9006l"
URL = "http://" + SERVER + ":" + PORT + "/SchnittstellenTestAufrufHandler?ik=" + IK + "&aufruf=ermittelnLeistungsmassnahme&trennzeichen=;&parameter=" + PARAMETER

# URL abfragen
ERGEBNIS = subprocess.call(["curl", "-s", URL])
print ERGEBNIS

print type(ERGEBNIS)

SPLIT = str(ERGEBNIS).split(';')
print SPLIT
print SPLIT[0]
[Codebox=python file=Unbenannt.py][/Codebox]
Und das die Ausgabe:
288;ermittelnLeistungsmassnahme;004b@-5envvvtg9006l;105823040;T_OK;B_OK;0
<type 'int'>
['0']
0
288;ermittelnLeistungsmassnahme;004b@-5envvvtg9006l;105823040;T_OK;B_OK soll bei jedem Semikolon getrennt werden, so dass eine Liste entsteht.
Benutzeravatar
snafu
User
Beiträge: 6851
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Du benutzt den falschen Bibliotheksaufruf für dein Vorhaben. Die Rückgabe von `subprocess.call()` ist eine Zahl, die angibt, ob die Ausführung des Programms erfolgreich war. Du willst aber offenbar die Ausgabe des Programms verarbeiten. Dafür eignet sich subprocess.check_output(), welches man genau so aufrufen kann wie `call()`, nur dass es einem die Programmausgabe anstelle des Statuscodes als Rückgabewert liefert.
peddy
User
Beiträge: 121
Registriert: Montag 30. Juni 2008, 13:51

Es kann manchmal so einfach sein. Genau das war es. Vielen Dank.
Sirius3
User
Beiträge: 18253
Registriert: Sonntag 21. Oktober 2012, 17:20

@peddy: Du benutzt ganz offensichtlich die falsche Bibliothek. Um Daten von einem HTTP-Server zu lesen gibt es in der Standardbibliothek urllib.urlopen. Das Zusammenstückeln einer URL mit + ist falsch, da nicht alle Zeichen erlaubt sind, unabhängig davon, ob man nun ein externes Programm benutzt oder nicht. Dafür gibt es urllib.urlencode.

Code: Alles auswählen

#!/usr/bin/env python
import urllib

SERVER = "svkol"
PORT = 31003
IK = "105823040"
PARAMETER = "004b@-5envvvtg9006l"

url = "http://{}:{}/SchnittstellenTestAufrufHandler?{}".format(SERVER, PORT,
    urllib.urlencode([
        ('ik', IK),
        ('aufruf', 'ermittelnLeistungsmassnahme'),
        ('trennzeichen', ''),
        ('parameter', PARAMETER'),
]))

ergebnis = urllib.urlopen(url)
print ergebnis.read()
Noch komfortabler geht es mit dem 3rd-party Modul requests.

Da es sich bei der Antwort des Servers offensichtlich um das csv-Format handelt, solltest Du zum Lesen das csv-Modul benutzen:

Code: Alles auswählen

ergebnis = urllib.urlopen(url)
daten = csv.reader(ergebnis, delimiter=';')
for datum in daten:
    print daten
peddy
User
Beiträge: 121
Registriert: Montag 30. Juni 2008, 13:51

@Sirius3

Vielen Dank. Ich habe mein Script entsprechend angepasst.
Antworten