Seite 1 von 1

subprocess.call Ausgabe trennen

Verfasst: Dienstag 7. Juni 2016, 06:38
von peddy
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.

Re: subprocess.call Ausgabe trennen

Verfasst: Dienstag 7. Juni 2016, 08:09
von snafu
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.

Re: subprocess.call Ausgabe trennen

Verfasst: Dienstag 7. Juni 2016, 08:14
von peddy
Es kann manchmal so einfach sein. Genau das war es. Vielen Dank.

Re: subprocess.call Ausgabe trennen

Verfasst: Dienstag 7. Juni 2016, 08:42
von Sirius3
@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

Re: subprocess.call Ausgabe trennen

Verfasst: Dienstag 7. Juni 2016, 09:35
von peddy
@Sirius3

Vielen Dank. Ich habe mein Script entsprechend angepasst.