Ausgabe von externem Befehl als PYthon Variable speichern ?

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
Benutzeravatar
HorstJENS
User
Beiträge: 123
Registriert: Donnerstag 9. Februar 2006, 21:41
Wohnort: Wien, Österreich
Kontaktdaten:

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 ?
http://spielend-programmieren.at
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

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]
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. :-)
Benutzeravatar
HorstJENS
User
Beiträge: 123
Registriert: Donnerstag 9. Februar 2006, 21:41
Wohnort: Wien, Österreich
Kontaktdaten:

werde subprocess verwenden, danke für die Hilfe.
http://spielend-programmieren.at
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.
Antworten