Kommandozeilenausgabe von os.popen abfangen

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
Greesce
User
Beiträge: 2
Registriert: Sonntag 9. August 2009, 10:02

Ich habe in meinem Programm eine Funktion enthalten die folgendermaßen
lautet:

Code: Alles auswählen

def OnRun(self,event):
        command = "g++ " + str(self.file)# + "-o " + binname 
        ausgabe = os.popen(command)
        for line in ausgabe:
            self.console.ChangeValue(line)
Das ganze ist ein Event von wxPython was aber hier nichts zur Sache tut.
Wenn ich jetzt das Programm starte zeigt er mir die ganzen Ausgaben von
g++ in der Kommandozeile an, aber nicht in dem Textfeld das console heißt.
Was ist daran der Fehler?

Hoffe ihr könnt mir helfen.

MfG
Greesce

P.S.
self.file ist ein absoluter Pfad zur Quelcode-Datei
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Du hast die Doku zu os.popen gelesen, oder?
Deprecated since version 2.6: This function is obsolete. Use the subprocess module. Check especially the Replacing Older Functions with the subprocess Module section.
Das Leben ist wie ein Tennisball.
Greesce
User
Beiträge: 2
Registriert: Sonntag 9. August 2009, 10:02

nein, aber ich habe leider nur die alte version von "Python - Das umfassende Handbuch" zu Python 2.5, aber wie wäre es dann möglich das ganze abzurufen?
BlackJack

@Greesce: Das `subprocess`-Modul gibt es auch schon in Python 2.5.

Und das Buch ist nicht unbedingt zu empfehlen.
problembär

@Greesce: Glaub' nicht alles, was die Leute hier erzählen.
subprocess ist zwar neuer, besser usw., manchmal aber auch Overkill. Probier mal:

Code: Alles auswählen

fh = os.popen(command)
ausgabe = fh.readlines()
fh.close()
Gruß
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

``subprocess`` ist da nicht sonderlich anders:

Code: Alles auswählen

proc = subprocess.Popen(command, stdout=subprocess.PIPE)
output = proc.communicate()
``proc.communicate`` gibt allerdings ``stdout`` _und_ ``stderr`` zurueck.
Man muss sie aber explizit in die PIPE haengen.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

problembär hat geschrieben:@Greesce: Glaub' nicht alles, was die Leute hier erzählen.
Was erzählen die Leute denn so Unwahrheiten? Was meinst du eigentlich, warum os.Popen "deprecated" ist... Weißt du überhaupt, was "deprecated" bedeutet?
problembär hat geschrieben:subprocess ist zwar neuer, besser usw., manchmal aber auch Overkill.
Das ist eine Begründung, die man eigentlich nur für einen Scherz halten kann.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

problembär hat geschrieben:subprocess ist zwar neuer, besser usw., manchmal aber auch Overkill.
Sauberes Escaping ist sicherlich overkill :roll:
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Alles, was über "funktioniert" hinaus geht, ist totaler Overkill! :evil:

Man sollte auch grundsätzlich den Befehl zum Schließen von Dateien meiden, weil man damit nur unnötige Bytes im Quellcode verbraucht. :) Von den Nanosekunden an zusätzlicher Rechenzeit mal abgesehen...
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Ei warum macht ihr denn jetzt Jagd auf Bruno? Einmal erwaehnen reicht dann doch :roll:
Antworten