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

Ausgabe von externem Befehl als PYthon Variable speichern ?

Beitragvon HorstJENS » Donnerstag 20. März 2008, 18:13

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

Beitragvon Trundle » Donnerstag 20. März 2008, 18:34

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

Beitragvon BlackJack » Donnerstag 20. März 2008, 18:36

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:

danke!

Beitragvon HorstJENS » Donnerstag 20. März 2008, 19:50

werde subprocess verwenden, danke für die Hilfe.
lunar

Beitragvon lunar » Freitag 21. März 2008, 11:26

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.

Wer ist online?

Mitglieder in diesem Forum: Baidu [Spider]