Seite 1 von 1

Ausgabe von externem Befehl als PYthon Variable speichern ?

Verfasst: Donnerstag 20. März 2008, 18:13
von HorstJENS
Ich weiss zwar das es stdin und stdout gibt, verstehe aber nicht wie ich sie benutzen kann. Hier meine Frage:

Wie übergebe ich den Output eines externen Programms direkt an eine Python-Variable ?

Bis jetzt lasse ich den Output des externen Programmes in eine Datei schreiben welche ich dann unter Python auslese... das geht doch direkter auch, oder ?

Ich habe ein externes Kommando welches mir die Größe (x,y) eines Bildes ermittelt und ausgibt.

Code: Alles auswählen

import os
command = "identify 'mylogo.png' | cut -f 3 -d' ' >> bildinfo.txt"
os.system(command)


Kann ich jetzt anstatt mir unter python bildinfo.txt zu öffnen die Ausgabe vom identify-Kommando direkt in einen raw_input hineinschicken lassen ? wie geht das ?

Verfasst: Donnerstag 20. März 2008, 18:34
von Trundle
Mit dem `[mod]subprocess[/mod]`-Modul, das als Ersatz für die ganzen {os.spawn*,os.popen*,os.system,...}-Funktionen gedacht ist.

Code: Alles auswählen

import subprocess
identify = subprocess.Popen(['identify', 'mylogo.png'], stdout=subprocess.PIPE)
size = identify.stdout.read().split()[2]

Verfasst: Donnerstag 20. März 2008, 18:36
von BlackJack
Das geht mit `os.system()` nicht. Dafür gibt's das `subprocess`-Modul:

Code: Alles auswählen

from subprocess import Popen, PIPE

def main():
    filename = 'test.png'
    identify = Popen(['identify', filename], stdout=PIPE)
    size = identify.stdout.read().split()[2]
    print size
Wobei vielleicht das `PIL`-Modul oder die Python-Anbindung an ImageMagick besser wären als das Aufrufen des Kommandozeilenprogramms. Wenn der Dateiname Leerzeichen enthält, wird's zum Beispiel interessant. :-)

danke!

Verfasst: Donnerstag 20. März 2008, 19:50
von HorstJENS
werde subprocess verwenden, danke für die Hilfe.

Verfasst: Freitag 21. März 2008, 11:26
von lunar
Nur noch als klarstellende Ergänzung zum bisher gesagten: os.system ist immer der falsche Ansatz zum Starten von Unterprozessen! Nicht nur, dass es aus dem Rückgabewert nichts über den gestarteten Prozess verrät, es ist auch im höchsten Maße unsicher, weil der Umweg über die Shell genommen wird.